Hibernate Row锁定读取

Jam*_*mes 0 java spring tomcat hibernate transactions

我有一个表Jobs包含字段NameStatus.

我正在尝试在tomcat实例中部署两个单独的应用程序来轮询jobs表以获取新记录,但重要的是两个进程都不会收到相同的作业记录.我怎样才能做到这一点?

到目前为止,我的(不成功)方法是使用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>
Run Code Online (Sandbox Code Playgroud)

由于这不起作用,我认为可能在tomcat中使用事务管理器,因此两个应用程序可以共享它可能会起作用,但我正在努力使其运行起来.这种方法有用吗?

inc*_*.de 9

你的问题的标题提到了hibernate所以让我们来看看JPA 2.0提供的内容LockMode和悲观锁定的概念.在您正在查看的情况下,您希望同时运行查询,并让每个JVM获得一组唯一的结果.在这种情况下,你想模仿一个SELECT... FOR UPDATE(这是一种专有的,并依赖于你的数据库,它是否将直接支持该声明).

在JPA 2.0中,您可以使用@LockMode并指定结果集是为了更新而检索的,因此将其"锁定"在数据库中,这样其他连接就不会得到相同的结果.

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

编辑>>>

如果您正在查看hibernate 3.x,请尝试链接