从jOOQ 3.4开始,我们在jOOQ的JDBC之上有一个简化事务逻辑的API,从jOOQ 3.17和 #13502 开始,在R2DBC之上也将提供一个同等的API,用于反应式应用。
与所有的jOOQ一样,交易是使用显式的、基于API的逻辑实现的。在Jakarta EE和Spring中实现的隐式逻辑对于那些到处使用注解和方面的平台来说非常有效,但基于注解的范式并不适合jOOQ。
本文展示了jOOQ是如何设计事务API的,以及为什么Spring Propagation.NESTED
语义在jOOQ中是默认的。
遵循JDBC的默认值
在JDBC中(和R2DBC一样),一个独立的语句总是非交易性的,或者说是自动提交的。对jOOQ来说也是如此。如果你把一个非交易性的JDBC连接传递给jOOQ,像这样的查询也将是自动提交的:
ctx.insertInto(BOOK) .columns(BOOK.ID, BOOK.TITLE) .values(1, "Beginning jOOQ") .values(2, "jOOQ Masterclass") .execute(); 复制代码
到目前为止还不错,这在大多数API中都是一个合理的默认值。但通常,你不会自动提交。你写的是事务性逻辑。
事务性的lambdas
如果你想在一个事务中运行多个语句,你可以在jOOQ中这样写:
// The transaction() call wraps a transaction ctx.transaction(trx -> { // The whole lambda expression is the transaction's content trx.dsl() .insertInto(AUTHOR) .columns(AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME) .values(1, "Tayo", "Koleoso") .values(2, "Anghel", "Leonard") .execute(); trx.dsl() .insertInto(BOOK) .columns(BOOK.ID, BOOK.AUTHOR_ID, BOOK.TITLE) .values(1, 1, "Beginning jOOQ") .values(2, 2, "jOOQ Masterclass") .execute(); // If the lambda is completed normally, we commit // If there's an exception, we rollback }); 复制代码
其心理模型与Jakarta EE和Spring @Transactional
方面完全相同。正常完成隐含地提交,特殊完成隐含地回滚。整个lambda是一个原子的 "工作单元",这是非常直观的。
你拥有你的控制流
如果你的代码中存在任何可恢复的异常,你可以