是的!我已经阅读了有关
的文档
- jOOQ永远不会在Connection上提交或回滚(除了 CSV导入,如果在Import API中明确配置)
- jOOQ永远不会开始任何交易。
- ...
但是当我需要一些事务管理时,最好的做法是什么?
我说过我是JOOQ的忠实粉丝!
答案 0 :(得分:11)
此问题是在jOOQ尚未实施交易API的时候提出的。从jOOQ 3.4开始,这样的API可用并在此处记录:
https://www.jooq.org/doc/latest/manual/sql-execution/transaction-management
默认情况下,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
并且嵌套事务在正常完成时丢弃保存点,或者在异常时回滚到它。
在许多应用程序中,您已经拥有一个预先存在的事务管理系统,例如JTA或Spring TX或其他东西。在这种情况下,您可以:
TransactionProvider
,它实现begin()
,commit()
和rollback()
操作的语义,例如通过将它们绑定到Spring。答案 1 :(得分:4)
事务控制独立于DB访问层,就像JOOQ提供的那样。
最好在应用程序的Service Layer处理开始和结束交易。请参阅该页面上的图表,其中显示了服务层与其调用的较低层的关系。
另请参阅Unit of Work或Transaction Script等模式。
答案 2 :(得分:0)
我可以通过以下链接找到一种简单的方法:http://blog.liftoffllc.in/2014/06/jooq-and-transactions.html。
这个答案可能会给你更详细的解释:https://stackoverflow.com/a/24380508/542108