【发布时间】:2013-02-16 01:53:22
【问题描述】:
是的!我已阅读有关
的文档
- jOOQ 永远不会在连接上提交或回滚(除了 CSV-imports,如果在 Import API 中明确配置)
- jOOQ 永远不会启动任何事务。
- ...
但是当我需要一些事务管理时,最好的做法是什么?
我有没有说过我是 JOOQ 方式的忠实粉丝!
【问题讨论】:
标签: java sql transactions jooq
是的!我已阅读有关
的文档
- jOOQ 永远不会在连接上提交或回滚(除了 CSV-imports,如果在 Import API 中明确配置)
- jOOQ 永远不会启动任何事务。
- ...
但是当我需要一些事务管理时,最好的做法是什么?
我有没有说过我是 JOOQ 方式的忠实粉丝!
【问题讨论】:
标签: java sql transactions jooq
这个问题是在 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。【讨论】:
DSL.using(configuration),在内部使用c1.dsl(),其中c1 是一个配置。如果你使用DSL.using(c1) 会有什么不同吗?
事务控制独立于 JOOQ 提供的数据库访问层。
开始和结束事务可能最好在您的应用程序的Service Layer 中处理。请参阅该页面上的图表,该图表显示了服务层与其调用的较低层的关系。
另请参阅 Unit of Work 或 Transaction Script 等模式。
【讨论】:
我可以通过以下链接找到一种简单的方法:http://blog.liftoffllc.in/2014/06/jooq-and-transactions.html。
这个答案可能会给你更详细的解释:https://stackoverflow.com/a/24380508/542108
【讨论】: