【问题标题】:How to start transaction and rollback with JOOQ?如何使用 JOOQ 启动事务和回滚?
【发布时间】:2013-02-16 01:53:22
【问题描述】:

是的!我已阅读有关

的文档
  • jOOQ 永远不会在连接上提交或回滚(除了 CSV-imports,如果在 Import API 中明确配置)
  • jOOQ 永远不会启动任何事务。
  • ...

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

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

【问题讨论】:

    标签: java sql transactions jooq


    【解决方案1】:

    这个问题是在 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,并且嵌套事务在正常完成时丢弃保存点,或在异常时回滚到它。

    覆盖默认的 JDBC 绑定

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

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

    【讨论】:

    • 现在,JOOQ 确实有交易代码。 jooq.org/doc/3.10/manual/sql-execution/transaction-management 所以我想这个答案应该更新。 StackOverflow 不鼓励关于“最佳实践”的问题,但我也想知道。在事务中,您应该继续使用相同的“DSLContext”对象,所以我想您必须将其传递给任何方法调用。
    • @Enwired:感谢您的 ping。我已经更新了过时的答案。不要担心“最佳实践”问题。如果问题是关于理解正确的行为,那应该没问题。如果您愿意,请随时提出新问题。我很乐意回答。
    • 我注意到在外部块中使用DSL.using(configuration),在内部使用c1.dsl(),其中c1 是一个配置。如果你使用DSL.using(c1) 会有什么不同吗?
    • 如果我们传递给 Jooq 的连接将自动提交设置为 true。那么在将连接传递给 Jooq 之前,Jooq 事务是否也可以工作,或者我们是否需要手动将 auto-commit 设置为 false?
    • @PratikSinghal:jOOQ 将在事务范围内将 autocommit 设置为 false,然后将其恢复为 true。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-08-19
        • 2021-03-20
        • 2015-12-03
        • 1970-01-01
        • 2019-01-17
        • 1970-01-01
        • 2021-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多