gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:19:11 27 4
gpt4 key购买 nike

我被要求实现一个“访问策略”,以限制与数据库直接连接的应用程序(不是网络应用程序)中某个进程的并发执行量。 p>

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

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

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

比如检查进程当前是否处于 Activity 状态:

SELECT Active FROM Process

如果它处于 Activity 状态,则返回“并发访问策略错误”。如果没有,请激活它:

UPDATE Process SET Active = 'Y'

一旦执行完成,只需更新 Activity 标志:

UPDATE Process SET Active = 'N'

但是,我遇到了一个主要问题:

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

有什么想法吗?

最佳答案

不要为 Activity 标志烦恼,只需根据用户 ID 锁定行即可。将该行锁定在专用事务/连接中。当其他用户尝试锁定该行(使用 SELECT ... FOR UPDATE)时,您将收到一个错误,您可以报告它。

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

赢得一切。

关于java - 使用数据库限制应用程序进程的并发执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29923503/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com