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

Mar*_*ark 10 java sql transactions jooq

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

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

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

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

Luk*_*der 12

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

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

Transaction API及其对JDBC的默认绑定

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

DSL.using(configuration)
   .transaction(c -> {
        c.dsl().insertInto(...).execute();
        c.dsl().update(...).execute();
   });
Run Code Online (Sandbox Code Playgroud)

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

这种交易可以嵌套

DSL.using(configuration)
   .transaction(c1 -> {
        c1.dsl().insertInto(...).execute();
        c1.dsl().transaction(c2 -> {
            c2.dsl().insertInto(...).execute();
        });
        c1.dsl().update(...).execute();
   });
Run Code Online (Sandbox Code Playgroud)

...如果Savepoint将在嵌套事务开始时创建一个,并且嵌套事务在正常完成时丢弃保存点,或者在异常时回滚到它.

覆盖默认的JDBC绑定

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

  • 根本不使用jOOQ事务API
  • 实现自己的TransactionProvider一个实现的语义begin(),commit()rollback()操作,例如通过将它们结合到春天.


Bil*_*win 5

事务控制独立于 JOOQ 提供的数据库访问层。

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

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