使用JPA本机查询的Spring启动+ JPA + Hibernate + PostgreSQL pessimistic_read

时间:2017-10-05 17:13:28

标签: java spring postgresql hibernate jpa

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

  • 我使用JPA原生查询从DB获取第一条记录

    @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);
    
  • 发布我正在使用更新查询将状态更改为已处理

  • 返回ID

上述情况引发了一个异常,说明" Lock的使用无效" (因为它不支持本机查询,只支持crud操作)。

在竞争条件期间,需要帮助使用PESSIMISTIC_READ使用SELECT for UPDATE和SKIP锁定行的原生查询。

1 个答案:

答案 0 :(得分:0)

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

  

FOR UPDATE SKIP LOCKED

@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);