当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring-bootJPA/hibernate将悲观_write锁与Spanner一起使用

阮炯
2023-03-14

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

我知道JPA中使用了“PESSIMSTIC_WRITE”锁。(在具有多个实例的应用程序上参考此链接JPA PESSIMSTIC_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);
        
    }
}

共有1个答案

盖锦程
2023-03-14

你是说你需要一把锁

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

对我来说,这听起来像是一个独家锁。这在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 中看到的值在提交时仍然未被任何其他人修改。

 类似资料:
  • 问题内容: 我正在使用Criteria API检索hibernate中的对象列表。但是,我需要锁定那些对象,因为同时执行的另一个线程将获得确切的对象,并且在没有悲观锁定的情况下,只有一个线程会成功。 我尝试如下,但它不起作用。 更新 :我正在执行此语句之后的更新,以便我希望两个线程都读取不同的行,或者至少第二个线程应该等到第一个线程完成事务并离开锁。 hibernate生成的查询如下。 更新 :这

  • 我正在使用Spring Boot、JPA、Oracle 12C和下面的类型化查询来选择要处理的“新”项目。一旦我选择了“新”项目,我就会更新其状态,使其不再符合选择条件,但我看到一个并发问题,相同的项目被选中。 我在这里读到,我需要设置一个'LockModeType.PESSIMISTIC_WRITE'的查询,以防止其他线程选择相同的行,但它似乎不起作用。 我是否遗漏了下面的内容,或者我是否需要另

  • 问题内容: 我在java下有spring项目,使用hibernate查询,我喜欢使用悲观锁定。 在Spring + Hibernate中如何进行悲观锁定? 编辑: 问题: 我想在一个方法中使用悲观锁定,并且我将此方法称为从不同的方法。当我从第一个方法调用它时,悲观的工作效果很好,但是当我从第二个方法调用它时,它给出了(无法提交事务) 例外: 问题答案: http://www.amicabile.c

  • 我试图理解Hibernate中的悲观锁定机制(通过MySQL DB)。 我尝试运行以下示例: 但它并没有给我一个错误,而是执行得很好。是不是我误解了什么概念。这种行为正常吗? 我能够完美地测试乐观锁定,那么对于悲观锁定,是对概念有一些误解,还是我的代码缺少了一些东西。

  • 编辑:在这种情况下,因为我使用了“版本”注释,所以我使用了乐观锁定,而不是悲观锁定。< br >如果我删除版本并因此禁用乐观锁定。悲观锁定会接管,性能会显著下降。< br >所以我想我必须忍受乐观锁定和偶尔的异常。有没有更好的解决办法? 原文:我目前通过ajp在apache 2.2负载均衡器中有多个Tomcat实例。后端系统处于Hibernate状态。该系统为多个用户和请求提供服务,对于请求,它会

  • 我想测试是否工作,有人调用后,其他人调用应该是等待。 以下是我的最佳尝试,它不起作用。我认为原因是