如何使用JOOQ启动事务和回滚?

是! 我已经阅读了有关的文档

  • jOOQ永远不会在Connection上提交或回滚(如果CSV导入除外,如果在Import API中明确配置)
  • jOOQ永远不会开始任何交易。

但是当我需要一些事务管理时,最好的做法是什么?

我说过我是JOOQ方式的忠实粉丝!

在jOOQ尚未实现事务API的时候问了这个问题。 从jOOQ 3.4开始,这样的API可用并在此处记录:

https://www.jooq.org/doc/latest/manual/sql-execution/transaction-management

Transaction API及其对JDBC的默认绑定

默认情况下,jOOQ通过一个简单的functionAPI直接将其(嵌套)事务支持绑定到JDBC API:

DSL.using(configuration) .transaction(c -> { c.dsl().insertInto(...).execute(); c.dsl().update(...).execute(); }); 

… lambda表达式(或更具体地说, TransactionalRunnable )在其开头创建一个新事务,并在正常完成时提交它,或者在exception时将其回滚。

这些交易可以嵌套

 DSL.using(configuration) .transaction(c1 -> { c1.dsl().insertInto(...).execute(); c1.dsl().transaction(c2 -> { c2.dsl().insertInto(...).execute(); }); c1.dsl().update(...).execute(); }); 

…如果在嵌套事务开始时将创建一个Savepoint ,嵌套事务将在正常完成时丢弃该保存点,或者在exception时回滚到该保存点。

覆盖默认的JDBC绑定

在许多应用程序中,您已经拥有一个预先存在的事务管理系统,例如JTA或Spring TX或其他东西。 在这种情况下,您可以:

  • 根本不使用jOOQ事务API
  • 实现自己的TransactionProvider ,它实现了begin()commit()rollback()操作的语义,例如通过将它们绑定到Spring。

事务控制独立于DB访问层,就像JOOQ提供的那样。

开始和结束交易可能最好在您的应用程序的服务层中处理。 请参阅该页面上的图表,其中显示了服务层与其调用的较低层的关系。

另请参见工作单元或事务脚本等模式 。

我可以通过以下链接找到一种简单的方法: http : //blog.liftoffllc.in/2014/06/jooq-and-transactions.html 。

这个答案可能会给你更详细的解释: https : //stackoverflow.com/a/24380508/542108