Aya*_*yan 7 spring hibernate jpa spring-data-jpa
我想SKIP LOCKED使用 Spring Data JPA 在 Oracle上执行查询,所以我尝试了以下操作:
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query(value = "SELECT * FROM User WHERE ID=?1 FOR UPDATE SKIP LOCKED", nativeQuery = true)
User findOne(UUID id);
Run Code Online (Sandbox Code Playgroud)
I tried the above and found that the generated query contains FOR UPDATE, but not SKIP LOCKED (below is the generated query from logs):
select ent0_.column1 as name, ent0_.CREATED_DATE as CREATED_2_33_0_ from TABLE_NAME alias_name where ent0_.column1=? for update
Run Code Online (Sandbox Code Playgroud)
If I remove @Lock from the query method, the generated query does not even have FOR UPDATE.
Please suggest how I can generate a query with FOR UPDATE SKIP LOCKED, as required.
您可以设置-2超时值,以便尽可能使用“跳过锁定”。
\n\n\nPESSIMISTIC_WRITE 的 javax.persistence.lock.timeout 设置为 -2
\n\n升级_跳过锁定
\n\n锁获取请求会跳过已锁定的行。它在 Oracle 和 PostgreSQL 9.5 中使用\n SELECT \xe2\x80\xa6\xe2\x80\x8b FOR UPDATE SKIP LOCKED,或\n SELECT \xe2\x80\xa6\xe2\x80\x8b with (rowlock, updlock, SQL Server 中的 readpast)。
\n
public interface MyRepository extends CrudRepository<MyEntity, Long> {\n\n /**\n * The lock acquisition request skips the already locked rows.\n * It uses a SELECT \xe2\x80\xa6\xe2\x80\x8b FOR UPDATE SKIP LOCKED in Oracle and PostgreSQL 9.5,\n * or SELECT \xe2\x80\xa6\xe2\x80\x8b with (rowlock, updlock, readpast) in SQL Server.\n */\n String UPGRADE_SKIPLOCKED = "-2";\n\n @Lock(value = LockModeType.PESSIMISTIC_WRITE) // adds \'FOR UPDATE\' statement\n @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = UPGRADE_SKIPLOCKED)})\n MyEntity findFirstByStatus(String status);\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n通过这样做,选择查询将具有select ... for update skip locked
https://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/chapters/locking/Locking.html
\n| 归档时间: |
|
| 查看次数: |
4064 次 |
| 最近记录: |