是的!我已经阅读了关于
- jOOQ 永远不会在连接上提交或回滚(CSV 导入除外,如果在导入 API 中明确配置)
- jOOQ 永远不会启动任何事务。
- ...
但是当我需要一些事务管理时,这样做的最佳实践是什么?
我有没有说过我是 JOOQ 的一种方式的忠实粉丝!
是的!我已经阅读了关于
- jOOQ 永远不会在连接上提交或回滚(CSV 导入除外,如果在导入 API 中明确配置)
- jOOQ 永远不会启动任何事务。
- ...
但是当我需要一些事务管理时,这样做的最佳实践是什么?
我有没有说过我是 JOOQ 的一种方式的忠实粉丝!
这个问题是在 jOOQ 还没有实现事务 API 的时候提出的。从 jOOQ 3.4 开始,这样的 API 可用并记录在这里:
https://www.jooq.org/doc/latest/manual/sql-execution/transaction-management
默认情况下,jOOQ 通过一个简单的函数式 API 直接将其(嵌套)事务支持绑定到 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
将在嵌套事务开始时创建 a 并且嵌套事务在正常完成时丢弃保存点,或者在异常时回滚到它。
在许多应用程序中,您已经拥有一个预先存在的事务管理系统,例如 JTA 或 Spring TX 或其他东西。在这种情况下,您可以:
TransactionProvider
的语义begin()
,例如通过将它们绑定到 Spring。commit()
rollback()
事务控制独立于 JOOQ 提供的数据库访问层。
开始和结束事务可能最好在应用程序的服务层中处理。请参阅该页面上的图表,该图表显示了服务层与其调用的较低层的关系。
另请参阅Unit of Work或Transaction Script等模式。
我可以从这个链接中找到一个简单的方法:http: //blog.liftoffllc.in/2014/06/jooq-and-transactions.html。
这个答案可能会给你更详细的解释:https ://stackoverflow.com/a/24380508/542108