如何在Hibernate中删除会话锁定

时间:2016-06-07 10:32:31

标签: hibernate

我在我的应用程序中使用旧版本的Hibernate。我在代码中使用session.lock(object,LOCKMODE.UPGRADE)来避免stalestate异常。我能够解决这个问题,但在一些数据库事务之后,应用程序被挂起了(我的猜测是DeadLock正在发生)。我的目标是在我的事务完成后,我想删除对象的锁定。我怎样才能实现同样的目标。

我面临的问题(StaleStateException)不是因为分离的对象。这是因为在我们坚持使用DB之前,实体正被其他事务(或线程)修改。以下是我们的代码流程。

DbRecord record = DAO.getBy(Id);
session.lock(record,LockMode.Upgrade);
// updating some record details and saving again into DB
session.saveOrUpdate(record)

我的目标我想在保存或更新后释放锁。

1 个答案:

答案 0 :(得分:1)

使用.lock()重新连接

Lock用于通过将对象置于分离模式来保存SQL / Transaction调用。

SessionFactory sf = new Configuration().configure()

       .buildSessionFactory();

Session sess = sf.openSession();
Transaction trx = sess.beginTransaction();

Vehicle v = (Vehicle) sess.get(Vehicle.class, 1L);

trx.commit();

sess.close();

System.out.println("vehicle now detached: " + v);



//update the vehichle outside of session when detached.

v.setVin(678);
//reattach using lock

sess = sf.openSession();

trx = sess.beginTransaction();

sess.buildLockRequest(LockOptions.NONE).lock(v);

System.out.println("completed the update call");

trx.commit();

sess.close();

System.out.println("vehicle synchronized again: " + v);

sql Generated如下所示

Hibernate:

    select

        vehicle0_.id as id0_0_,

        vehicle0_.make as make0_0_,

        vehicle0_.model as model0_0_,

        vehicle0_.vin as vin0_0_

    from

        Vehicle vehicle0_

   where

       vehicle0_.id=?
  

车辆现已分离:车辆[id = 1,make =雪佛兰,型号=轿车,vin = 345]

完成了更新通话

  

车辆再次同步:车辆[id = 1,make =雪佛兰,型号=轿车,vin = 678]

现在再次可以更新锁定。这样可以避免您的应用程序挂起。

请参阅here