2013-07-20 101 views
0

我有一个表Jobs与字段NameStatus休眠行锁定读取

我想在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中的事务管理器,因此它可以通过这两个应用程序共享可能工作,但我正在努力获得和运行。这种方法会起作用吗?

回答

5

您的问题的标题提到休眠,所以让我们看看JPA 2.0提供什么是围绕LockMode和悲观锁定的想法。在您查看的情况下,您希望可能同时运行查询,并让每个JVM获得一组唯一的结果。既然如此,你想模仿一个SELECT... FOR UPDATE(这是有点专有的,并且依赖于你的数据库是否会直接支持该语句)。

在JPA 2.0你可以使用@LockMode并指定该结果集是更新的意图获取,所以“锁定”在它的数据库中,因此没有其他连接可以得到相同的结果。

看看this这篇文章,试图比我更好地解释它,并特别关注'悲观'模式。

编辑>>>

如果你正在寻找在休眠3.x中,尝试this链接

+0

非常感谢您的帮助。我错误地认为我在后文的SI例子中依赖于hibernate - 它只是使用数据源的SQL。我添加了“FOR UPDATE”,并且工作完美。谢谢! – James