可用版本: Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

FOR UPDATE子句

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

出于进程间同步和其他原因,您可以选择使用 SELECT .. FOR UPDATE 子句来指示数据库,给定的事务应锁定一组单元格或记录以进行后续更新。使用 jOOQ,可以通过以下方式实现

SELECT *
FROM BOOK
WHERE ID = 3
FOR UPDATE
 
create.select()
      .from(BOOK)
      .where(BOOK.ID.eq(3))
      .forUpdate()
      .fetch();

上面的示例将生成一个记录锁,锁定整个记录以进行更新。一些数据库也支持使用 FOR UPDATE OF .. 的单元格锁

SELECT *
FROM BOOK
WHERE ID = 3
FOR UPDATE OF TITLE
 
create.select()
      .from(BOOK)
      .where(BOOK.ID.eq(3))
      .forUpdate().of(BOOK.TITLE)
      .fetch();

Oracle 更进一步,还允许指定实际的锁定行为。它具有以下附加子句,jOOQ 全部支持这些子句

  • FOR UPDATE NOWAIT:这是默认行为。如果无法获取锁,查询会立即失败
  • FOR UPDATE WAIT n:尝试等待 [n] 秒以获取锁。查询仅在此之后才会失败
  • FOR UPDATE SKIP LOCKED:这个特殊的语法将跳过所有锁定的记录。这在实现具有多个消费者的队列表时特别有用

使用 jOOQ,您可以像这样使用这些 Oracle 扩展

create.select().from(BOOK).where(BOOK.ID.eq(3)).forUpdate().nowait().fetch();
create.select().from(BOOK).where(BOOK.ID.eq(3)).forUpdate().wait(5).fetch();
create.select().from(BOOK).where(BOOK.ID.eq(3)).forUpdate().skipLocked().fetch();

使用 FOR SHARE 子句进行悲观(共享)锁定

一些数据库(MySQL、Postgres)也允许使用 FOR SHARE 子句显式发出非独占锁。jOOQ 也支持这一点

jOOQ 中的乐观锁定

请注意,如果您正在进行简单的 CRUD,jOOQ 也支持乐观锁定。这在有关 乐观锁定 的手册章节中进行了记录。

反馈

您对此页面有任何反馈吗? 我们很乐意听到!

The jOOQ Logo