2017-10-05 78 views
0

我需要從尚未處理的表中返回一個項目ID(在給定時間可以有多個可用但我需要返回每個請求唯一的ID) 。Spring引導+ JPA + Hibernate + PostgreSQL pessimistic_read與JPA本機查詢

  • 我使用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 findByStateAndStatus(@Param("name") String name, @Param("city") String city); 
    
  • 後,我改變了狀態,以獲取第一條記錄從DB使用更新查詢

  • 返回的ID
處理

上面的場景會引發一個異常,說明「鎖使用無效」(因爲它不支持本機查詢並且只支持ts crud操作)。

在競爭條件期間,需要使用PESSIMISTIC_READ使用SELECT for UPDATE和SKIP鎖定行的本機查詢的幫助。

回答

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 findByStateAndStatus(@Param("name") String name, @Param("city") String city);