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

时间:2013-03-01 14:16:32

标签: java sql transactions jooq

是的!我已经阅读了有关

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

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

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

3 个答案:

答案 0 :(得分:11)

此问题是在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();
   });

... 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。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:0)

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

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