【问题标题】:How I can achieve SKIP LOCKED functionality using pessimistic lock?如何使用悲观锁实现 SKIP LOCKED 功能?
【发布时间】:2020-07-14 03:14:46
【问题描述】:

我想实现跳过锁。我正在使用 postgres 9.6.17。我正在使用以下代码

@Lock(LockModeType.PESSIMISTIC_WRITE)
@QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "-2")})
@Query("Select d from Demo d where d.id in (?1)")
List<Demo> getElementByIds(List<Long> ids);

我正在通过 cmd 同时从 2 个服务进行相同的 DB 调用(对进行 DB 调用的两个服务的并行 Curl 请求)。我从 1 个服务器传递 1...4 的 id,而从其他服务器传递 1.....7 的 id。 但是如果第一个服务在 1...4 行上锁定,然后第二个服务必须等到第一个服务删除它的锁,但理想情况下,第二个服务应该返回第 5...7 行 从我这样调用的第一个服务开始

List<Long> ids = new ArrayList<>();
    ids.add(1l);
    ids.add(2l);
    ids.add(3l);
    ids.add(4l);
    List<Demo> demos = demoRepo.getElementByIds(ids);
    try{
        Thread.sleep(500);
    } catch (Exception e) {

    }
    logger.info("current time: " + System.currentTimeMillis());

从第二个服务我这样调用:

List<Long> ids = new ArrayList<>();
    ids.add(1l);
    ids.add(2l);
    ids.add(3l);
    ids.add(4l);
    ids.add(5l);
    ids.add(6l);
    ids.add(7l);
    try{
        Thread.sleep(100);
    } catch (Exception e) {

    }
    logger.info("current time: " + System.currentTimeMillis());
    List<Demo> demos = demoRepo.getElementByIds(ids);
    logger.info("current time: " + System.currentTimeMillis());

但在等待另一个服务释放锁之后,这两个查询总是返回相同的行。

我正在使用的 Spring JPA 版本:

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.2.5.RELEASE</version>

我也尝试过在应用程序级别本身 spring.jpa.javax.persistence.lock.timeout=-2 也不起作用。 这两种方法似乎都像 PESSIMISTIC_WRITE 一样工作。

请建议我如何实现跳过锁定功能。

【问题讨论】:

  • 你确定调用有并发吗?请注意,Thread.sleep 在调用存储库的上下文之外,因此可能只是调用足够快并且根本没有并发。

标签: postgresql hibernate spring-boot spring-data-jpa jpa-2.0


【解决方案1】:

查询似乎是正确的。

希望您使用支持跳过锁定功能的最新 Postgres 方言。

考虑到您使用的 Postgres 版本,应使用以下方言。 org.hibernate.dialect.PostgreSQL95方言

您可以参考this link了解更多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-08
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多