操作的乐观锁定

Optimistic locking for operations

我在文档中看到了乐观锁的例子,它是有效的:

// Properly configure the DSLContext
DSLContext optimistic = DSL.using(connection, SQLDialect.ORACLE,
  new Settings().withExecuteWithOptimisticLocking(true));
  
// Fetch a book two times
BookRecord book1 = optimistic.fetchOne(BOOK, BOOK.ID.eq(5));
BookRecord book2 = optimistic.fetchOne(BOOK, BOOK.ID.eq(5));

// Change the title and store this book. The MODIFIED value has not been changed since the book was fetched.
// It can be safely updated
book1.setTitle("Animal Farm");
book1.store();

但我对操作的乐观锁定有疑问。如我所见,乐观锁定仅适用于 store() 方法。 我有机会以这种方式进行乐观锁定吗:

dslContext.update(getIdField().getTable())
            .set(getEntityField(), dto)
            .where(getIdField().eq(dto.getId()))

  dslContext.batch(updateOperations).execute();

从 jOOQ 3.16 开始,jOOQ 的乐观锁定是 UpdatableRecord 唯一的功能,这意味着它适用于 jOOQ-generated SQL 来自您的 insert()update()store()merge()delete() 次调用记录在案。它不适用于任何其他查询。

在 jOOQ 的未来版本中,可能会有此功能的 re-design 以使用名为 "client side computed columns" (#9879). The re-design is tracked as #13339 的新 jOOQ 3.17 功能。它可能会或可能不会随 jOOQ 3.17 一起提供。一旦实现,您的任意 DML 语句将被转换以实现乐观锁定语义。