我有一个表 Jobs
,其中包含字段 Name
和 Status
。
我正在尝试在 tomcat 实例中部署两个单独的应用程序以轮询作业表以获取新记录,但重要的是两个进程不会收到相同的作业记录。我该怎么做?
到目前为止,我的(不成功的)方法是使用 spring 集成:
<int-jdbc:inbound-channel-adapter
query="select * from jobs where status=1"
channel="rawInputDataListChannel"
data-source="dataSource"
update="update input_table set status=2 where status=1">
<int:poller fixed-rate="1">
<int:transactional isolation="READ_COMMITTED" />
</int:poller>
</int-jdbc:inbound-channel-adapter>
因为这行不通,我认为也许在 tomcat 中拥有事务管理器以便它可以被两个应用程序共享可能会起作用,但我正在努力启动和运行它。这种方法行得通吗?
最佳答案
你的问题的标题提到了 hibernate ,所以让我们看看 JPA 2.0 必须提供什么,这是围绕 LockMode
和悲观锁定的想法。在您正在查看的情况下,您可能希望同时运行查询,并让每个 JVM 获得一组唯一的结果。在这种情况下,您想要模拟 SELECT... FOR UPDATE
(它有点专有并且取决于您的数据库是否直接支持该语句)。
在 JPA 2.0 中,您可以使用 @LockMode
并指定以更新为目的检索结果集,因此将其“锁定”在数据库中,这样其他连接就无法获得相同的结果。
看看this尝试比我更好地解释它的文章,并特别关注“悲观”模式。
编辑>>>
如果您正在查看 hibernate 3.x,请尝试 this链接
关于java - Hibernate 读行锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17757732/