Hibernate 如何使用API标准指定悲观锁?
我正在使用CriteriaAPI检索hibernate中的对象列表。但是,我需要锁定这些对象,因为同时执行的另一个线程将获得确切的对象,并且在没有悲观锁定的情况下,只有一个线程会成功 我试着像下面这样,但它不工作Hibernate 如何使用API标准指定悲观锁?,hibernate,hibernate-criteria,Hibernate,Hibernate Criteria,我正在使用CriteriaAPI检索hibernate中的对象列表。但是,我需要锁定这些对象,因为同时执行的另一个线程将获得确切的对象,并且在没有悲观锁定的情况下,只有一个线程会成功 我试着像下面这样,但它不工作 List esns = session .createCriteria(Reddy_Pool.class) .add(Restrictions.eq("status", "AVAILABLE")) .add(Restrictions.eq("name", "RE
List esns = session
.createCriteria(Reddy_Pool.class)
.add(Restrictions.eq("status", "AVAILABLE"))
.add(Restrictions.eq("name", "REDDY2"))
.addOrder(Order.asc("id"))
.setMaxResults(n)
.setLockMode(LockMode.PESSIMISTIC_WRITE) //not working at all
.list();
更新:我在此语句之后执行更新,因此我希望两个线程读取不同的行,或者至少第二个线程应该等待第一个线程完成事务并离开锁
下面是hibernate生成的查询
Hibernate: select this_.id as id1_0_, this_.name as name1_0_,
this_.orderitem_id as orderitem3_1_0_, this_.status as status1_0_,
this_.store as store1_0_, this_.vendor as vendor1_0_, this_.version as version1_0_
from reddy_pool this_
where this_.status=? and and this_.name=? order by this_.id asc limit ?
更新:正如Pascal Thivent(非常感谢Pascal)所提到的,3.5.2版本中似乎有一个bug,我已作为成员加入并关注该问题。希望它能包含在下一个版本中
然而,我尝试在这里使用另一种方法来处理session.buildLockRequest()
。。。但我不太明白如何使用它,使用下面的代码根本没有任何效果
for (int i=0; i < n; i++)
session.buildLockRequest(LockOptions.UPGRADE).lock(esns.get(i));
for(int i=0;i
您使用的是什么版本的Hibernate?可能是这样吗?您确定没有生成更新的语句吗?您能显示生成的SQL吗?您所说的“不工作”是什么意思?如果没有锁,两次读取都应该成功。@Péter,更新了我的问题。基本上,我希望在选择之后执行更新。这是hibernate生成的查询(版本:3.5.2 Final),是的,这看起来像HHH-5275,这是否意味着我们必须等到下一个版本(Hibernate:将此.id选择为id1\U 0,将此.orderitem\U id选择为name1\U 0,将此.orderitem\U id选择为orderitem3\U 1\U 0,将此状态选择为status1\U 0,将此存储为store1\U 0,将此供应商选择为vendor1\U 0,将此版本选择为version1\U 0,从reddy\U池选择此\U.status=?和此\U.name=?按此\U.id限制订购?谢谢您再次尝试oach使用会话来放置锁(请参阅我问题中的第二个更新)但它也不起作用。因为这个问题,我不得不交换我的条件查询。这似乎是一个大问题-为什么HH-5275被认为是次要的?@Anthony我不知道。在国际海事组织,你能做的最好的事情就是投票支持这个问题,并对Jira发表评论。对于那些有这个问题的人,这已经在Hibernate 4.0.1中修复。