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 也支持乐观锁定。这在有关 乐观锁定 的手册章节中进行了记录。
反馈
您对此页面有任何反馈吗? 我们很乐意听到!