【问题标题】:Pessimistic locking fails with ObjectOptimisticLockingFailureException悲观锁定失败并出现 ObjectOptimisticLockingFailureException
【发布时间】:2015-05-28 22:19:48
【问题描述】:

我使用 Spring Data JPA 和 Hibernate 作为 PostgreSQL 上的持久性提供程序。我正在尝试提供悲观锁定:

public interface MediaRepository extends JpaRepository<Media, Long>, MediaRepositoryCustom {
Long countByCreatedBy(User creator);

@Query("select m from Media m where m.id = ?1")
@Lock(LockModeType.PESSIMISTIC_WRITE)
Media findOneAndLock(Long id);
}

我尝试从 2 个线程调用 findOneAndLock。我希望如果Thread A 锁定对象,Thread B 应该等到锁被释放。但是 Thread B 会抛出 org.springframework.orm.ObjectOptimisticLockingFailureException。

我确定两个线程都执行 select for update(数据库日志中有 2 条这样的记录)。

【问题讨论】:

    标签: java spring hibernate postgresql jpa


    【解决方案1】:

    默认行为是不等待。您需要在persistence.xml中指定等待时间

    <properties>
       <property name="javax.persistence.lock.timeout" value="1000"/>
    </properties>
    

    【讨论】:

    • 价值是多少?第二个线程只会等待配置的时间,而不是无限期地等待。
    • 10000。再次,我抓住了 org.springframework.orm.ObjectOptimisticLockingFailureException。
    • 这个异常是立即发生还是 10 秒后发生?
    • 它立即发生,它的堆栈跟踪包括对findOneAndLock的调用
    • 是的,因为它是一个提示,可能并不总是适用。阅读here。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    相关资源
    最近更新 更多