jOOQ事务提前生效?使用returningResult()存在回滚异常?
问题解答
1、每次执行insert操作后是否需要额外调用.execute()方法?
分两种情况:
- 对于带
returning的insert语句,你调用的.fetchOne()属于jOOQ的结果抓取类方法,这类方法会隐含触发SQL执行,不需要额外调用.execute(),所以你writeFn中的insert是正常执行到数据库的。 - 对于没有
returning的普通insert语句,仅调用.set()方法只是构造了SQL抽象语法树,必须调用.execute()或者对应的fetch类方法才会真正提交到数据库执行,你secondWriteFn中的insert没有加执行逻辑,这就是第二张表没有数据的直接原因。
2、若整个操作都在事务范围内,将前一次insert的返回值用于后续insert操作是否存在问题?
不存在问题,这是事务内处理关联表插入的标准合法逻辑。
事务未回滚的根因说明
你遇到的第一张表数据未回滚问题,是事务配置用法错误导致的:
jOOQ的transaction()方法传入的lambda参数writeTransaction本身就是事务绑定的Configuration实现,你需要用这个参数来构造事务内的DSLContext,而不是用你自己的全局configuration。你当前在writeFn、secondWriteFn中用DSL.using(configuration)构造的DSLContext走的是独立的自动提交连接,所以writeFn的插入执行完就直接提交了,后续抛出异常也不会回滚这部分数据。
内容的提问来源于stack exchange,提问作者acme-j
相关产品推荐
相关产品推荐

