是的!我已经阅读了有关
的文档
- jOOQ will never commit or rollback on the Connection (Except for CSV-imports, if explicitly configured in the Import API)
- jOOQ will never start any transactions.
- ...
但是当我需要一些事务管理时,最佳做法是什么?
我说过我是 JOOQ 方式的忠实粉丝吗?
最佳答案
这个问题是在 jOOQ 尚未实现事务 API 时提出的。从 jOOQ 3.4 开始,这样的 API 可用并记录在此处:
https://www.jooq.org/doc/latest/manual/sql-execution/transaction-management
事务 API 及其与 JDBC 的默认绑定(bind)
默认情况下,jOOQ 通过一个简单的函数式 API 将其(嵌套的)事务支持直接绑定(bind)到 JDBC API:
DSL.using(configuration)
.transaction(c -> {
c.dsl().insertInto(...).execute();
c.dsl().update(...).execute();
});
... lambda 表达式(或更具体地说,TransactionalRunnable
)在其开头创建一个新事务并在正常完成时提交它,或在异常时回滚它。
这样的事务可以嵌套
DSL.using(configuration)
.transaction(c1 -> {
c1.dsl().insertInto(...).execute();
c1.dsl().transaction(c2 -> {
c2.dsl().insertInto(...).execute();
});
c1.dsl().update(...).execute();
});
... 如果是 Savepoint
将在嵌套事务开始时创建,嵌套事务在正常完成时丢弃保存点,或在异常时回滚到它。
覆盖默认的 JDBC 绑定(bind)
在许多应用程序中,您已经有了一个预先存在的事务管理系统,例如JTA 或 Spring TX 或其他。在这种情况下,您可以:
- 根本不使用 jOOQ 事务 API
- 实现您自己的
TransactionProvider
它实现了begin()
、commit()
和rollback()
操作的语义,例如通过将它们绑定(bind)到 Spring。
关于java - JOOQ如何启动事务和回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15159842/