gpt4 book ai didi

Spring Data JPA + Hibernate 跳过锁定行(PostgreSQL)

转载 作者:行者123 更新时间:2023-11-29 12:23:57 25 4
gpt4 key购买 nike

我正在尝试使用 Spring Data JPA (2.1) 和 Hibernate 在 PostgreSQL 上执行 SKIP LOCKED 查询。查询如下所示:

@Lock(LockModeType.PESSIMISTIC_WRITE)
@QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="-2")})
List<Obj> findByEntityAndStatus(Entity entity, Status status);

根据 Spring data JPA native query skip lockedSelect for update skip locked from JPA level它应该可以工作,但生成的查询只选择更新而不跳过锁定的行。

生成的查询:

Hibernate: select obj0_.id as id1_5_, obj0_.name as name6_5_, obj0_.entity_id as entity10_5_, obj0_.status as status8_5_ from objs obj0_ left outer join entities entity1_ on obj0_.entity_id=entity1_.id where entity1_.id=? and obj0_.status=? for update of obj0_

我错过了什么?

最佳答案

您的代码没问题。您只需要记住 PESSIMISTIC_WRITE 在 Oracle 和 PostgreSQL 9.5 中使用 SELECT … FOR UPDATE SKIP LOCKED。我假设您可能已经忘记告诉 JPA,您应该使用更新版本的 Postgres。所以你有两个选择:

  • 告诉 JPA 您正在使用支持 SKIP LOCKED 的 PostgreSQL Dialect:
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect
    在此之后我收到了所需的输出:
    where
    subscripti0_.valid_until<=?
    and subscripti0_.status='ACTIVE'
    for update of subscripti0_1_ skip locked
    显然,在事务完成之前,并发线程无法获取锁定的行。
  • 使用原生查询:
    SELECT * FROM objects o WHERE o.valid_until <= :validUntil FOR UPDATE SKIP LOCKED 

关于Spring Data JPA + Hibernate 跳过锁定行(PostgreSQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52058253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com