我在我的应用程序中使用旧版本的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)
我的目标我想在保存或更新后释放锁。
答案 0 :(得分:1)
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