当前位置: 首页 > 面试题库 >

如何使用Criteria API指定悲观锁?

慕金林
2023-03-14
问题内容

我正在使用Criteria
API检索hibernate中的对象列表。但是,我需要锁定那些对象,因为同时执行的另一个线程将获得确切的对象,并且在没有悲观锁定的情况下,只有一个线程会成功。

我尝试如下,但它不起作用。

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 ?

更新 :这似乎是3.5.2版本中的一个错误,正如Pascal
Thivent(非常感谢Pascal)提到的那样,我已经作为成员加入并观看了此问题。希望它将包含在下一个版本中。

但是,我尝试在此处使用另一种方法session.buildLockRequest()…但我无法弄清楚如何使用它,使用下面的代码根本没有任何效果。

for (int i=0; i < n; i++)
    session.buildLockRequest(LockOptions.UPGRADE).lock(esns.get(i));

问题答案:

您正在使用哪个版本的Hibernate?可以是HHH-5275吗?您确定FOR UPDATE未生成该语句吗?您可以显示生成的SQL吗?



 类似资料:
  • 问题内容: 我在java下有spring项目,使用hibernate查询,我喜欢使用悲观锁定。 在Spring + Hibernate中如何进行悲观锁定? 编辑: 问题: 我想在一个方法中使用悲观锁定,并且我将此方法称为从不同的方法。当我从第一个方法调用它时,悲观的工作效果很好,但是当我从第二个方法调用它时,它给出了(无法提交事务) 例外: 问题答案: http://www.amicabile.c

  • 这是令人难以置信的沮丧…我正在使用Couchbase v3 C API,我遇到了一个问题,这个问题可以通过使用他们的“悲观”锁定来完美解决。经过一番努力,我相信我终于找到了如何使用它锁定记录(使用,它大概需要一个以微秒为单位的参数),但是我不知道如何在完成后解锁记录,除了让它超时,这不是一个可以接受的解决方案。 这里的文档提供了一个示例,但出于某种未知的原因,它使用的是Javascript而不是C

  • 编辑:在这种情况下,因为我使用了“版本”注释,所以我使用了乐观锁定,而不是悲观锁定。< br >如果我删除版本并因此禁用乐观锁定。悲观锁定会接管,性能会显著下降。< br >所以我想我必须忍受乐观锁定和偶尔的异常。有没有更好的解决办法? 原文:我目前通过ajp在apache 2.2负载均衡器中有多个Tomcat实例。后端系统处于Hibernate状态。该系统为多个用户和请求提供服务,对于请求,它会

  • 我试图理解Hibernate中的悲观锁定机制(通过MySQL DB)。 我尝试运行以下示例: 但它并没有给我一个错误,而是执行得很好。是不是我误解了什么概念。这种行为正常吗? 我能够完美地测试乐观锁定,那么对于悲观锁定,是对概念有一些误解,还是我的代码缺少了一些东西。

  • 用户其实并不需要花很多精力去担心锁定策略的问题。通常情况下,只要为 JDBC 连接指定一下隔离级别,然后让数据库去搞定一切就够了。然而,高级用户有时候希望进行一个排它的悲观锁定,或者在一个新的事务启动的时候,重新进行锁定。 Hibernate 总是使用数据库的锁定机制,从不在内存中锁定对象。 类 LockMode 定义了 Hibernate 所需的不同的锁定级别。一个锁定可以通过以下的机制来设置:

  • 我想测试是否工作,有人调用后,其他人调用应该是等待。 以下是我的最佳尝试,它不起作用。我认为原因是