繁体   English   中英

如何使用 Spring 引导 JPA/hibernate 在 Spanner 中使用 pessimistic_write 锁

[英]How to use pessimistic_write lock with Spanner using Spring boot JPA/hibernate

我正在使用带有 Spring 引导和 JPA 的 spanner 数据库。我有一个要求,每当从员工表中读取员工信息时,在事务完成之前,没有人可以读取/更新/删除相同的行信息。

为此,我知道 JPA 中使用了“PESSIMISTIC_WRITE”锁。( 在具有多个实例的应用程序上引用此链接 JPA PESSIMISTIC_WRITE

我试图通过使用下面的代码来使用它,但它没有持有锁。 当我尝试从其他实例中命中相同的查询时,它给出了结果。 理想情况下,它应该等到第一笔交易完成但仍会给出结果。

你能给我建议任何解决方案吗?

我正在使用下面的代码来实现相同的目的。

@Repository
public interface EmployeeRepository extends JpaRepository<EmployeeEntity, Integer> {

    @lock(LockModeType.PESSIMISTIC_WRITE)
    @query("SELECT c FROM Employee c WHERE c.empId = :empId)
    public EmployeeEnity getEmployee(@param("empId") Integer empId);
}

@Service
public class EmpService implement IEmpService {

@Autowired
EmployeeRepository  empRepository;

@Transactional
@Override
    public EmployeeEntity getEmployee(Integer empId) {

        return empRepository.getClientId(clientId);
        
    }
}

你是说你需要一把锁

在事务完成之前,没有人可以读取/更新/删除同一行信息

对我来说,这听起来像是一个独占锁。 这在 Cloud Spanner 中不可用。

问题是在这种情况下这是否是您真正需要的。 Cloud Spanner 中的读/写事务具有外部一致性 总结一下你的具体问题,这可以归结为以下几点:

  1. 事务 A 读取行 R1。
  2. 事务 A 更改了 R1 的值。
  3. 事务 A 提交。

Cloud Spanner 保证在事务 A 提交的那一刻,R1 的值仍然与它在步骤 1 中读取的值相同。如果您还有一个事务 B,它几乎同时执行以下操作:

  1. 事务 B 读取行 R1。
  2. 事务 B 更改了 R1 的值。
  3. 事务 B 提交。

(所以两个事务读取和修改同一行)

那么保证这样的效果要么是事务A先执行,然后事务B。要么事务B先执行,然后事务A。(也就是说,看起来事务是顺序执行的。)在在所有情况下,两个事务都保证它们在步骤 1 中看到的值在提交时仍未被其他任何人修改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM