春季数据 JDBC 跳过锁定



我正在尝试使用 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 实现此目的的唯一方法。

最新更新