2014-05-18 59 views
0

我使用Hibernate版本4.我们在批处理过程中遇到问题。我们的系统会立即运行情况如下表级锁进入休眠状态

  1. 的记录选择一套是“PENDING”状态
  2. 更新为“进行中”状态
  3. 过程,并更新为“已完成”状态

当我们有两台服务器并同时执行时,我们担心出现并发问题。所以我们想要实现DB锁定的前两个步骤。我们使用query.setLockOptions(),但它似乎不起作用。有没有其他人有表级锁或行级锁,直到它完成选择和更新。两者都在同一个会话中。

我们在JDBC中有选项LOCK TABLE <TABLE_NAME> WRITE。但我们如何实现在休眠或是否有可能实现select..for更新在休眠?

回答

3

Hibernate通过LockMode.UPGRADE支持“Select ... for update”,您可以在其中设置,例如NamedQuery

但是,使用应用程序/手动表行锁定有几个缺点(尤其是当一个数据库连接被打破中途交易),你的更新过程也离不开它:

  • 开始交易。
  • update table set state ='PENDING',server_id = 1 where state ='IN PROGRESS';
  • 提交事务
  • select from table where state ='PENDING'and server_id = 1;
  • [过程记录]

每个服务器都必须对这个工作的唯一编号,但是这将是容易出错少,你让DBMS做它应该是擅长:隔离(见ACID)。