1

我有一个应用程序在两个不同的服务器实例上运行。应用程序有一个单例 EJB,它的定时器设置为每隔一分钟运行一次。EJB 中的方法从表中读取记录并将其删除并将其发布到队列中(一个事务的所有部分)。两台服务器启动后,它会尝试同时从表中读取记录。

我的问题是如何只允许一个应用程序读取记录,直到事务结束。

4

2 回答 2

1

您可以使用 select 进行更新:

select * from table for update

这将在事务时间阻塞选定的记录,即其他服务器发出的相同查询将等待事务提交。

SELECT ... FOR UPDATE 读取最新的可用数据,在它读取的每一行上设置排他锁。因此,它设置了与搜索的 SQL UPDATE 将在行上设置的锁相同的锁。

https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html

于 2017-07-28T11:34:52.030 回答
0

感谢你的回答!

这就是我最终要做的。我正在使用 jboss 应用程序服务器,并且我实现了 HASingleton 功能,该功能仅允许一个单例 bean 实例一次在集群环境中的一台服务器上运行。

https://docs.jboss.org/author/display/WFLY10/HA+Singleton+Features

于 2017-08-16T16:29:12.353 回答