11

是的!我已经阅读了关于

  • jOOQ 永远不会在连接上提交或回滚(CSV 导入除外,如果在导入 API 中明确配置)
  • jOOQ 永远不会启动任何事务。
  • ...

但是当我需要一些事务管理时,这样做的最佳实践是什么?

我有没有说过我是 JOOQ 的一种方式的忠实粉丝!

4

3 回答 3

12

这个问题是在 jOOQ 还没有实现事务 API 的时候提出的。从 jOOQ 3.4 开始,这样的 API 可用并记录在这里:

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

事务 API 及其与 JDBC 的默认绑定

默认情况下,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 并且嵌套事务在正常完成时丢弃保存点,或者在异常时回滚到它。

覆盖默认的 JDBC 绑定

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

  • 根本不使用 jOOQ 事务 API
  • 实现您自己的实现、 和操作TransactionProvider的语义begin(),例如通过将它们绑定到 Spring。commit()rollback()
于 2013-03-02T09:29:07.867 回答
5

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

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

另请参阅Unit of WorkTransaction Script等模式。

于 2013-03-02T09:36:03.590 回答
0

我可以从这个链接中找到一个简单的方法:http: //blog.liftoffllc.in/2014/06/jooq-and-transactions.html

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

于 2014-06-24T07:24:14.270 回答