我有一个应用程序在两个不同的服务器实例上运行。应用程序有一个单例 EJB,它的定时器设置为每隔一分钟运行一次。EJB 中的方法从表中读取记录并将其删除并将其发布到队列中(一个事务的所有部分)。两台服务器启动后,它会尝试同时从表中读取记录。
我的问题是如何只允许一个应用程序读取记录,直到事务结束。
我有一个应用程序在两个不同的服务器实例上运行。应用程序有一个单例 EJB,它的定时器设置为每隔一分钟运行一次。EJB 中的方法从表中读取记录并将其删除并将其发布到队列中(一个事务的所有部分)。两台服务器启动后,它会尝试同时从表中读取记录。
我的问题是如何只允许一个应用程序读取记录,直到事务结束。
您可以使用 select 进行更新:
select * from table for update
这将在事务时间阻塞选定的记录,即其他服务器发出的相同查询将等待事务提交。
SELECT ... FOR UPDATE 读取最新的可用数据,在它读取的每一行上设置排他锁。因此,它设置了与搜索的 SQL UPDATE 将在行上设置的锁相同的锁。
https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html
感谢你的回答!
这就是我最终要做的。我正在使用 jboss 应用程序服务器,并且我实现了 HASingleton 功能,该功能仅允许一个单例 bean 实例一次在集群环境中的一台服务器上运行。
https://docs.jboss.org/author/display/WFLY10/HA+Singleton+Features