如何使用JPA获取PessimisticLockException

时间:2017-07-25 16:35:07

标签: java jpa locking jpa-2.0 pessimistic-locking

我正在尝试JPA对数据库锁定的支持,以避免记录中的并发请求。在我的场景中,我需要使用悲观锁。我使用以下方法得到了它:

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 个答案:

答案 0 :(得分:1)

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

  

当无法获取锁定时,数据库锁定失败   导致事务级回滚,提供者必须抛出   PessimisticLockException并确保JTA事务或   EntityTransaction已标记为回滚。

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

  

当无法获取锁定时,数据库锁定失败   导致只有语句级回滚,提供者必须抛出   LockTimeoutException(并且不能将事务标记为回滚)。

我认为这是驱动程序/持久性提供程序的一种聪明方式,可以让您有机会重复/修复语句,而不是隐式回滚整个事务。

一般来说,我认为如果你在查找之前有一个插入或更新(或者一些更复杂的数据操作语句),那么你将获得PessimisticLockException