我使用 Hibernate 版本 4。我们在批处理过程中遇到问题。我们的系统工作原理如下
- 选择处于“PENDING”状态的记录集
- 立即更新为“IN PROGRESS”状态
- 处理它并更新到“COMPLETED”状态
当我们有两台服务器并同时执行时,我们担心会出现并发问题。所以我们想在前两个步骤中实现DB Lock。我们用了query.setLockOptions()
,但似乎不起作用。是否还有其他具有表级锁或行级锁,直到完成选择和更新。两者都在同一会话中。
我们在 JDBC 中有一些选项LOCK TABLE <TABLE_NAME> WRITE
。但是我们如何在hibernate中实现或者是否可以在hibernate中实现select..for update?
Hibernate 通过以下方式支持“选择...进行更新”锁定模式.升级 http://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/LockMode.html#UPGRADE您可以将其设置为,例如命名查询 http://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/jpamodelgen/xml/jaxb/NamedQuery.html#setLockMode%28org.hibernate.jpamodelgen.xml.jaxb.LockModeType%29.
但是使用应用程序/手动表行锁定有几个缺点(特别是当数据库连接在事务中途中断时),并且您的更新过程可以不使用它:
- 开始交易。
- 更新表设置 state='PENDING', server_id=1 where state='IN PROGRESS';
- 提交交易
- 从表中选择,其中 state='PENDING' 且 server_id=1;
- 【流程记录】
每个服务器都必须有一个唯一的编号才能工作,但它不太容易出错,并且您可以让 DBMS 做它应该擅长的事情:隔离(请参阅ACID http://en.wikipedia.org/wiki/ACID).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)