首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Spring /hibernate与扳手一起使用pessimistic_write锁

如何使用Spring /hibernate与扳手一起使用pessimistic_write锁
EN

Stack Overflow用户
提问于 2022-04-05 10:59:42
回答 1查看 212关注 0票数 0

我使用扳手数据库与Spring和JPA。我有一个要求,比如,每当从employee表读取雇员信息时,任何人都不能读取/更新/删除同一行信息,直到事务完成为止。

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

我试着用下面的代码来使用它,但是它不能保持锁。当我试图从其他实例点击相同的查询时,它会给出结果。理想情况下,它应该等到第一个事务完成,但仍然给出结果。

你能给我建议什么解决办法吗?

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

代码语言:javascript
复制
@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);
        
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-04-05 12:20:13

你是说你需要一个锁

在事务完成之前,任何人都不能读取/更新/删除同一行信息。

对我来说这听起来是个独家的锁。这在云扳手中不可用。

问题是,在这种情况下,这是否是真正需要的。云扳手中的读/写事务有外部一致性。就你的具体问题来说,简短地总结一下如下:

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

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

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

(因此,两个事务都读取和修改了同一行)

然后保证这样做的效果是事务A先执行,然后是事务B,或者是事务B先执行,然后是事务A(也就是说,这些事务似乎是按顺序执行的)。在所有情况下,都保证在步骤1中看到的值在提交时不会被其他任何人修改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71750596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档