当其他事务读取同一行时,Spring JPA PESSIMISTIC_WRITE锁定模式不会锁定行

时间:2020-02-14 16:49:39

标签: java spring hibernate locking

以下是一种事务处理方法,该方法从数据库中检索现有行并更新其列值之一,然后保存回数据库中:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public A updateTotalItem(String id, int newItemNum) {
    A a = aRepository.findById(id).orElseThrow(() -> new IllegalArgumentException());
    a.updateValues(newItemNum);
    return aRepository.save(a);
}

并且我已将PESSIMISTIC_WRITE锁应用于aRepository.findById()

@Repository
public interface ARepository extends JpaRepository<A, String> {
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    Optional<A> findById(String id);
}

但是,我发现如果有两个并发调用上述事务方法(提供了相同的id参数),即使第一个事务将阻止第二个事务的更新,但是在第一个之后如果事务已提交,则第二个事务将不会检索包含更新数据的行,相反,它仍会在提交第一个事务之前获得包含数据的行。如果我正确理解PESSIMISTIC_WRITE锁定,它应该锁定行/实体以进行读/写操作,但是在这种情况下,看起来它仅锁定了它的写入操作,我是否理解错了?如果可以,是否可以使用任何方法来达到锁定行/实体以进行读/写的效果,以防止并发事务获取旧数据?

PS:我将Hibernate用作ORM,将Postgres用作数据库

0 个答案:

没有答案
相关问题