使用数据库限制应用程序进程的并发执行

Fed*_*ina 5 java database postgresql concurrency

我被要求实施一个"访问策略"来限制与数据库直接连接的应用程序(不是Web应用程序)中的证书过程的并发执行量.

应用程序在多台计算机上运行,​​如果多于用户尝试调用该进程,则在给定时间只允许执行一次,另一次必须返回错误消息(不等待第一次执行结束).

虽然我使用的是Java/Postgres,但这是一个普遍的问题.

鉴于我在多台机器上运行相同的应用程序,我能想到的最简单的解决方案是实现某种"数据库标志".

检查流程当前是否处于活动状态:

SELECT Active FROM Process
Run Code Online (Sandbox Code Playgroud)

如果它处于活动状态,则返回"并发访问策略错误".如果没有,请激活它:

UPDATE Process SET Active = 'Y'
Run Code Online (Sandbox Code Playgroud)

执行完成后,只需更新活动标志:

UPDATE Process SET Active = 'N'
Run Code Online (Sandbox Code Playgroud)

但是,我遇到了一个重大问题:

  • 如果我不使用DB事务来更改活动标志,并且应用程序被终止,则活动标志将永远保留Y值.
  • 如果我使用数据库事务,第一点就解决了.但是,主机中活动标志的更改(从N到Y)只有在提交后才会显示,因此其他主机永远不会读取带有Y值的活动,因此无论如何都会执行.

有任何想法吗?

Wil*_*ung 1

不必费心使用活动标志,只需根据用户 ID 锁定行即可。将该行锁定在专用事务/连接中。当其他用户尝试锁定该行(使用 SELECT ... FOR UPDATE)时,您将收到错误,并且可以报告该错误。

如果持有事务的进程失败,则释放锁。如果退出,锁就会被释放。如果数据库重新启动,锁就会被释放。

赢得一切。