2014-10-10 50 views
0

Hibernate有PESSIMISTIC锁定机制,可用于锁定数据库行。使用hiberante锁定对象session.load

session.lock(Object object,LockMode lockMode)。

可以说,我锁定一个目标:

1)session.lock(myObject.LockMODE.READ) 
2)session.lock(myObject,LockMODE.UPGRADE) 
3)session.lock(myObject.LockMODE.UPGRADE_NOWAIT) 
  1. 如果其他线程还发出上述statments 1,将happend给它什么 ?该线程是否会阻塞?或者它会得到 某种异常吗?CannotAcquireLock异常?我想 想了解1,2,3的行为。
  2. 如果一个线程获得一个锁,然后死了会发生什么? 锁会自动释放吗?还是记录永久锁定?

    session.lock(myObject,LOCKMODE.SOME_LOCK_MODE) 
        //thread dies . (lets say JVM is killed) 
    

回答

0

锁被绑定到该事务。一旦事务被提交或回滚,它就会被释放。如果你的线程死亡,并保持你的交易悬而未决,锁仍然成立。

尝试获取锁的其他线程将等待。

如果我没有记错,调用lock()将导致select ... for update SQL语句。

+0

感谢您的回答。如何让我的另一个线程不要等待?我想要其他线程返回(可能有一些例外),如果他们不能获取锁定。 – user93796 2014-10-10 07:38:31

+0

我不确定这是可能的。我只是在我们使用lock()的地方检查了代码,但是我没有看到那种类型。如果它真的转化为select for update,那么数据库会锁定你。你需要锁定不同的虚拟机,还是只需要在一台虚拟机中?在后一种情况下,您可以尝试一些Java同步机制。 – 2014-10-10 07:55:57