我有一个应用程序在两个不同的服务器实例上运行。应用程序有一个单例EJB,其定时器设置为每隔一分钟运行一次。 EJB中的方法从表中读取记录,将其删除并将其发布到队列上(一个事务的所有部分)。一旦两台服务器启动,它就会尝试从表中同时读取记录。多服务器应用程序读取同一表中的数据
我的问题是如何让只有一个应用程序读取记录,直到事务结束。
我有一个应用程序在两个不同的服务器实例上运行。应用程序有一个单例EJB,其定时器设置为每隔一分钟运行一次。 EJB中的方法从表中读取记录,将其删除并将其发布到队列上(一个事务的所有部分)。一旦两台服务器启动,它就会尝试从表中同时读取记录。多服务器应用程序读取同一表中的数据
我的问题是如何让只有一个应用程序读取记录,直到事务结束。
您可以使用选择的更新:
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功能,该功能只允许在群集环境中的一台服务器上同时运行一个singleton bean实例。
https://docs.jboss.org/author/display/WFLY10/HA+Singleton+Features