2015-05-28 74 views
0

我使用Spring数据JPA与Hibernate作为PostgreSQL上的持久性提供者。我试图提供悲观锁定:悲观锁定失败ObjectOptimisticLockingFailureException

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个这样的记录)。

回答

1

默认行为是不等待。您需要在persistence.xml

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

中指定等待期,它已被设置。 – skozlov

+0

什么是价值?而第二个线程将只等待配置的时间,而不是无限期地等待。 – Rohit

+0

10000.再次,我捕获org.springframework.orm.ObjectOptimisticLockingFailureException。 – skozlov