以下是一种事务处理方法,该方法从数据库中检索现有行并更新其列值之一,然后保存回数据库中:
@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用作数据库