没有函数的 DefaultTransactionProvider 的 JOOQ 交易

JOOQ transactions with DefaultTransactionProvider without functions

我知道我可以将 DefaultTransactionProviderDSLContext 和像这样的 lambda 一起使用

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

但是我想在代码块的范围之外控制我的事务(但仍然使用 DefaultTransactionProvider 作为其带有检查点的行为,这就是我正在寻找的)。更多类似内容

configuration.transactionProvider().begin(transactionContext);
DSL.using(configuration)
    .update(TABLE)
    .set(TABLE.COL, newValue)
    .where(...)
    .execute();
configuration.transactionProvider().commit(transactionContext);

这可能吗?还是我需要自己实现事务 SPI 才能完成?

从 jOOQ 3.8 开始,开箱即用是不可能的。有一个待处理的功能请求: https://github.com/jOOQ/jOOQ/issues/5376

您的代码可能会起作用:

configuration.transactionProvider().begin(transactionContext);
DSL.using(configuration)
   .update(TABLE)...
configuration.transactionProvider().commit(transactionContext);

但请注意,您调用的是 SPI 方法,而不是 API 方法。这些方法不是为您作为 API 消费者直接访问而设计的。它们专为在 Configuration 中实施和注入 jOOQ SPI 上下文而设计。如果您想继续此路径,您的 TransactionProvider 将需要访问 Configuration.connectionProvider() 并修改其状态,以便始终生成正确的连接,直到 commit()rollback() 被调用.

另请参阅 jOOQ 用户组的相关讨论: https://groups.google.com/forum/#!msg/jooq-user/1JwWMChD2SM/NHUhSnI8AgAJ