我正在尝试使用 Spring Data JDBC 使用 SKIP LOCK 修饰符获取行锁定。
当使用JPA(休眠)时,你可以通过使用提示@QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value="-2")})
来实现这一点
我可以用Spring Data JDBC做到这一点吗?
就像你提到的,在 JPA 世界中,JPA 实现(例如 Hibernate)是理解javax.persistence.lock.timeout
并将SKIP LOCKED
(如果方言允许)应用于查询的实现
。 使用 Spring DataJDBC,您可以获得 Spring Data 查询派生的好处,但它最终处理的抽象比 JPA 少得多,并且倾向于更频繁地使用本机 SQL。当涉及到诸如SKIP LOCKED
之类的东西时,这可能是一个挑战,它们是非标准的,取决于所使用的 DBMS。
因此,Spring Data JDBC中没有反映JPA的提示或类似概念。但是,由于 Spring Data JDBC 仍然允许您指定@Query
(并且仅适用于本机 SQL),因此您可以利用它来使用SKIP LOCKED
:
@Query("SELECT * FROM PERSON WHERE first_name = :firstName FOR UPDATE SKIP LOCKED")
List<Person> findByFirstNameForUpdateSkipLocked(String firstName);
据我所知,将SKIP LOCKED
指定为本机查询是使用 Spring Data JDBC 实现此目的的唯一方法。