首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java PESSIMISTIC_WRITE未按预期工作

Java PESSIMISTIC_WRITE未按预期工作
EN

Stack Overflow用户
提问于 2022-08-26 19:25:01
回答 1查看 146关注 0票数 0

我希望锁定Postgres数据库中的某些行,以便在进程完成之前甚至无法读取它。我在这里上读到,使用JPA PESSIMISTIC_WRITE是可以实现的,但是由于数据仍然是可读的,所以它不能像预期的那样工作。

控制器

我的控制器中有两个函数,第一个用于锁定数据,第二个是测试函数,以验证锁是否正确工作。

代码语言:javascript
复制
@GetMapping(value = "/lockdata")
public String controllerLockData() {
    serviceImplementation.lockData();
    return "sucess";
}

@GetMapping(value = "/test-lock")
public String testLock() {
    serviceImplementation.testReadUpdate();
    return "sucess";
}

serviceImplementation

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

我就是这样做测试的。

  1. 将第一列值设置为"2“(供以后验证)
  2. 调用/lockdata,直到命中第一个断点,以确保代码被执行,然后在IDE中继续该进程。现在我有60秒的时间来做测试,希望锁已经被应用了。
  3. 调用/测试-锁,#3断点将立即与正确的数据击中,而我认为它不应该,因为我希望它会等到锁解除。
  4. 继续IDE进程。#第四个断点被击中,这意味着保存已经执行。
  5. 使用pgAdmin在1分钟前检查数据。select查询是成功的(与以前一样,它应该等待锁被解除)。第一列值为"2“。这意味着更新正在等待锁被解除。
  6. 在命中1分钟#第二个断点后,继续IDE进程。
  7. 再次使用pgAdmin检查数据。第一列值为"1“。

这意味着更新进程是正确执行的,但是不知怎么的,锁并不适用于read。从我前面提到的文章来看,这可能是多版本并发控制的结果。如果是这样的话,那么PESSIMISTIC_READ和PESSIMISTIC_WRITE没有什么不同。我如何才能真正锁定行,使任何其他进程都无法选择它?

我是做错了还是误解了什么?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-26 19:44:35

正如您在本文中所读到的,它取决于数据库配置。现在,标准是在可重复读取中配置数据库,因为它提供了更好的性能和更少的锁。隔离水平。正如您在postgres中所看到的,简单的select永远不会锁定。

但是,如果testlock函数使用LockModeType.PESSIMISTIC_READ,则在工作时进行测试。

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

https://stackoverflow.com/questions/73505688

复制
相关文章

相似问题

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