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用户组的相关讨论:
谢谢,我会留意这项功能。