我有两个关于Hibernate 3.3.2.ga中可用的悲观锁模的问题:
如果我使用lockmode UPGRADE锁定一组行,那么当您离开事务范围时,是否会释放锁定?如果是,我们可以跨交易锁定解锁吗?
对于以下场景,哪个LockMode有用
线程1,尝试获取锁并锁定一组行
线程2,尝试在同一组行上获取锁定(由线程1锁定)此时线程2获得一个异常,表示行已锁定
哪个是最好的悲观锁模?
答案 0 :(得分:3)
LockMode.UPGRADE使用select ... for update
,因此会锁定the whole duration of the current transaction。释放锁的唯一方法是提交或回滚事务。
select ... for update
锁将导致第二个事务等待第一个事务释放锁。如果您想快速失败,则需要使用:UPGRADE_NOWAIT,它将使用select ... for update no wait
查询,如果无法获取锁定,则抛出异常(Oracle和PostgreSQL支持此操作)。 p>
或者,您可以按如下方式使用Hibernate LockOptions
:
entityManager
.unwrap(Session.class)
.buildLockRequest(
new LockOptions(LockMode.PESSIMISTIC_WRITE)
.setTimeOut(LockOptions.NO_WAIT))
.lock(entity);
有关详细信息,请查看我在苏黎世Voxxed Days的Transactions and Concurrency Control presentation。