我使用扳手数据库与Spring和JPA。我有一个要求,比如,每当从employee表读取雇员信息时,任何人都不能读取/更新/删除同一行信息,直到事务完成为止。
为此,我知道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);
}
}发布于 2022-04-05 12:20:13
你是说你需要一个锁
在事务完成之前,任何人都不能读取/更新/删除同一行信息。
对我来说这听起来是个独家的锁。这在云扳手中不可用。
问题是,在这种情况下,这是否是真正需要的。云扳手中的读/写事务有外部一致性。就你的具体问题来说,简短地总结一下如下:
云扳手保证事务A提交时,R1的值仍然与步骤1中读取的值相同。如果您还有一个事务B,它几乎同时执行以下操作:
(因此,两个事务都读取和修改了同一行)
然后保证这样做的效果是事务A先执行,然后是事务B,或者是事务B先执行,然后是事务A(也就是说,这些事务似乎是按顺序执行的)。在所有情况下,都保证在步骤1中看到的值在提交时不会被其他任何人修改。
https://stackoverflow.com/questions/71750596
复制相似问题