Spring boot + JPA + Hibernate + PostgreSQL pessimistic_read



我需要从尚未处理的表中返回一个项目 id(在给定时间可能有多个可用,但我需要为每个请求返回唯一 id)。

  • 我正在使用 JPA 本机查询从数据库获取第一条记录

    @Lock(LockModeType.PESSIMISTIC_READ)
    @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="5000")})
    @Query(value = "SELECT id FROM item WHERE name->> 'name'=:name AND city->> 'city'=:city LIMIT 1",nativeQuery = true)
    public String find(@Param("name") String name, @Param("city") String city);
    
  • 发布我正在使用更新查询将状态更改为已处理的帖子

  • 返回身份证件

上述场景会引发异常,指出"Lock 使用无效"(因为它不支持本机查询,仅支持 crud 操作)。

需要帮助才能在争用条件下使用本机查询对 SELECT for UPDATE 和 SKIP 锁定行使用PESSIMISTIC_READ本机查询

通过在查询中添加以下行解决了这个问题。

对于更新跳过锁定

@Query(value = "SELECT id FROM item WHERE name->> 'name'=:name AND city->> 'city'=:city LIMIT 1 FOR UPDATE SKIP LOCKED",nativeQuery = true)
public String find(@Param("name") String name, @Param("city") String city);

最新更新