【问题标题】:How to get a PessimisticLockException with JPA如何使用 JPA 获取 PessimisticLockException
【发布时间】:2017-07-25 16:35:07
【问题描述】:

我正在尝试 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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2013-03-22
      • 2019-07-26
      • 2012-01-18
      • 2016-02-08
      • 2020-10-16
      • 1970-01-01
      相关资源
      最近更新 更多