Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当其他事务读取同一行时,Spring JPA悲观_写锁定模式不会锁定行_Java_Spring_Hibernate_Locking - Fatal编程技术网

Java 当其他事务读取同一行时,Spring JPA悲观_写锁定模式不会锁定行

Java 当其他事务读取同一行时,Spring JPA悲观_写锁定模式不会锁定行,java,spring,hibernate,locking,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.updat

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

@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);
}
我已经对aRepository.findById()应用了一个悲观的写入锁:

@存储库
公共接口ARepository扩展了JpaRepository{
@锁(锁模式类型。悲观写入)
可选的findById(字符串id);
}
但是,我发现,如果有两个对上述事务方法的并发调用(提供了相同的
id
参数),即使第一个事务将阻止第二个事务的更新,但在提交第一个事务后,第二个事务将不会检索具有更新数据的行,它仍然会在提交第一个事务之前获取包含数据的行。如果我正确理解了
悲观\ u WRITE
lock,它应该为读/写锁定行/实体,但在这种情况下,它似乎只为写而锁定,我理解错了吗?如果是,有什么方法可以实现锁定行/实体进行读/写的效果,以防止并发事务获取旧数据


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

您找到解决方案了吗?我也有类似的问题。使用悲观写入,我希望为任何其他读/写操作锁定该行,但我仍然可以从其他行读取transactions@jpincz,不,我最终使用了本机查询,它有
SELECT。。。用于更新
@Repository
public interface ARepository extends JpaRepository<A, String> {
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    Optional<A> findById(String id);
}