表级别锁定在休眠状态

时间:2014-05-18 08:42:25

标签: java mysql hibernate concurrency locking

我使用的是Hibernate版本4.我们在批处理过程中遇到了问题。我们的系统如下工作

  1. 选择' PENDING'状态
  2. 立即更新至'进展中'状态
  3. 处理并更新为“已完成”'状态
  4. 当我们有两个服务器并同时执行时,我们担心会出现并发问题。所以我们想在前两步实现DB Lock。我们使用了query.setLockOptions(),但似乎无效。是否还有其他任何表级锁或行级锁,直到它完成选择和更新。两者都处于相同的会话中。

    我们在JDBC中有LOCK TABLE <TABLE_NAME> WRITE的选项。但是我们如何在hibernate中实现,还是可以在hibernate中实现select..for update?

1 个答案:

答案 0 :(得分:3)

“选择...进行更新”在Hibernate中通过您可以设置的LockMode.UPGRADE支持,例如NamedQuery

但是使用应用程序/手动表行锁定有几个缺点(特别是当数据库连接在事务中途中断时),并且更新过程可以在没有它的情况下执行:

  • 开始交易。
  • 更新表设置状态='PENDING',server_id = 1其中state ='IN PROGRESS';
  • 提交交易
  • 从表中选择state ='PENDING'和server_id = 1;
  • [过程记录]

每个服务器必须有一个唯一的编号才能工作,但它不会出错,你让DBMS做了它应该擅长的事情:隔离(见ACID)。