提问者:小点点

乐观锁定在Hibernate中是否默认工作?


步骤1在一个线程中,我从Hibernate会话中的DB获取ID 1的员工并关闭会话

步骤2我开始了会话2,更新了id 1的员工姓名。

步骤3现在回到线程1,我在分离实例中更改了员工姓名。然后打开Hibernate会话并更新db中的emp

我期待并发更新异常,因为线程2更新了中间版本。为什么不抛出它?我想我在这里缺少一些概念,但不确定是什么?

这是相关代码:-

线程1

    Step 1
    Employee Employee1=(Employee)session.get(Employee.class, 1);
    session.close();

    Step 2
    // Start new Thread i.e Thread 2 and update Employee in between
       Makes sure thread 2 is done before proceeding to step3


     Step 3
    Employee.setName("EmployeeUpdated");
    session = factory.openSession();
    tx = session.beginTransaction();
    session.update(Employee);
    tx.commit();// expect the concurrent update here
    session.close();

线程2

      Thread(SessionFactory factory){
           this.factory = factory; // same factory as used in Thread1
       }

      public  void run() {


    Session session  = factory.openSession();

    Transaction tx = session.beginTransaction();
    Employee Employee1=(Employee)session.get(Employee.class, 1);
    tx.commit();
    session.close();

    session = factory.openSession();
    tx = session.beginTransaction();
    Employee1.setName("EmployeeUpdatedByThread2");
    session.merge(Employee1);
    tx.commit();
    session.close();
}

hibernate在更新时是否需要显式配置来检查版本?


共1个答案

匿名用户

我需要在对象下的版本属性上添加@Version(我们在其中启用乐观锁定)才能使用乐观锁定。这个链接帮助很大。