Java 不带函数的DefaultTransactionProvider的JOOQ事务

Java 不带函数的DefaultTransactionProvider的JOOQ事务,java,database,transactions,jooq,Java,Database,Transactions,Jooq,我知道我可以将DefaultTransactionProvider与DSLContext和lambda一起使用 DSL.using(configuration) .transaction(ctx -> { DSL.using(ctx) .update(TABLE) .set(TABLE.COL, newValue) .where(...) .execute(); }); configura

我知道我可以将
DefaultTransactionProvider
DSLContext
和lambda一起使用

DSL.using(configuration)
   .transaction(ctx -> {
       DSL.using(ctx)
          .update(TABLE)
          .set(TABLE.COL, newValue)
          .where(...)
          .execute();
});
configuration.transactionProvider().begin(transactionContext);
DSL.using(configuration)
    .update(TABLE)
    .set(TABLE.COL, newValue)
    .where(...)
    .execute();
configuration.transactionProvider().commit(transactionContext);
但是,我希望将我的事务控制在代码块范围之外(但仍然使用
DefaultTransactionProvider
作为其检查点行为,这正是我所寻找的)。更像这样

DSL.using(configuration)
   .transaction(ctx -> {
       DSL.using(ctx)
          .update(TABLE)
          .set(TABLE.COL, newValue)
          .where(...)
          .execute();
});
configuration.transactionProvider().begin(transactionContext);
DSL.using(configuration)
    .update(TABLE)
    .set(TABLE.COL, newValue)
    .where(...)
    .execute();
configuration.transactionProvider().commit(transactionContext);

这是可能的,还是我需要自己实现事务SPI才能实现这一点?

从jOOQ 3.8开始,这是不可能的。对此存在挂起的功能请求:

您的代码可能会工作:

configuration.transactionProvider().begin(transactionContext);
DSL.using(configuration)
   .update(TABLE)...
configuration.transactionProvider().commit(transactionContext);
但请注意,您调用的是SPI方法,而不是API方法。这些方法不是为API使用者直接访问而设计的。它们是为实现和注入到
配置中的jOOQ-SPI上下文而设计的。如果要继续此路径,您的
TransactionProvider
将需要访问
配置.connectionProvider()
并修改其状态,以便始终生成正确的连接,直到调用
commit()
rollback()

另请参见关于jOOQ用户组的相关讨论:

谢谢,我会留意这项功能。