2017-07-25 180 views
1

我正在尝试JPA支持数据库锁定以避免记录中的并发请求。在我的情况下,我需要使用pesssimistic锁。我得到了使用以下方法:如何用JPA获得PessimisticLockException

EntityManager em; 
... 

Map<String,Object> props = new HashMap<String,Object>(); 
props.put("javax.persistence.lock.timeout", 0); 
em.find(MyEntity.class, id, LockModeType.PESSIMISTIC_READ, props) 

,但这种做法我处理LockTimeoutException而不是PessimisticLockException如何处理PessimisticLockException特别是

回答

1

根据此规范,PessimisticLockException只发生在事务级回滚:

如果不能获得锁,和数据库锁定故障 导致事务级回滚,提供者必须抛出 PessimisticLockException并确保已将JTA事务或 EntityTransaction标记为回滚。

您的事务似乎只包含该单一数据检索查询,并且持续性提供程序认为如果该查询发生锁定错误,则回滚将被视为语句级别回滚。其中根据规范将导致LockTimeoutException

如果不能获得锁,和数据库锁定故障 仅导致语句级回滚,提供者必须抛出 LockTimeoutException(且不得标注回滚事务)。

我认为这是一个驱动程序/持久性提供程序的聪明方式,让您有机会重复/修复您的语句,而不是隐式地回滚整个事务。一般来说,我认为如果你在查找之前有一个插入或者更新(或者一些更复杂的数据操作语句),那么你会得到PessimisticLockException