我希望锁定Postgres数据库中的某些行,以便在进程完成之前甚至无法读取它。我在这里上读到,使用JPA PESSIMISTIC_WRITE是可以实现的,但是由于数据仍然是可读的,所以它不能像预期的那样工作。
控制器
我的控制器中有两个函数,第一个用于锁定数据,第二个是测试函数,以验证锁是否正确工作。
@GetMapping(value = "/lockdata")
public String controllerLockData() {
serviceImplementation.lockData();
return "sucess";
}
@GetMapping(value = "/test-lock")
public String testLock() {
serviceImplementation.testReadUpdate();
return "sucess";
}serviceImplementation
@Override
@Transactional
public void lockData() {
SomeTableEntity table = entityManager.find(SomeTableRepository.class, 42366L, LockModeType.PESSIMISTIC_WRITE);
try {
TimeUnit.SECONDS.sleep(60); // #1st Breakpoints, 60 second delay so I can do some testing in this 60 second
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
table.setColumnOne("0"); // #2nd Breakpoints
tableRepository.save(table);
}
@Override
@Transactional
public void testLock() {
SomeTableEntity table = tableRepository.getOne(42366L);
table.setColumnOne("1"); //#3rd breakpoint
tableRepository.save(table);
int a = 1; //#4th breakpoint
}我就是这样做测试的。
这意味着更新进程是正确执行的,但是不知怎么的,锁并不适用于read。从我前面提到的文章来看,这可能是多版本并发控制的结果。如果是这样的话,那么PESSIMISTIC_READ和PESSIMISTIC_WRITE没有什么不同。我如何才能真正锁定行,使任何其他进程都无法选择它?
我是做错了还是误解了什么?
谢谢。
发布于 2022-08-26 19:44:35
正如您在本文中所读到的,它取决于数据库配置。现在,标准是在可重复读取中配置数据库,因为它提供了更好的性能和更少的锁。隔离水平。正如您在postgres中所看到的,简单的select永远不会锁定。
但是,如果testlock函数使用LockModeType.PESSIMISTIC_READ,则在工作时进行测试。
https://stackoverflow.com/questions/73505688
复制相似问题