jOOQ是如何设计事务API(详细指南)

本文探讨了jOOQ如何设计事务API,强调其与JDBC和R2DBC的交互,以及与Spring的Propagation.REQUIRED和NESTED语义的差异。jOOQ采用显式、基于API的事务管理,支持事务性的lambdas和嵌套事务,旨在提供更直观和灵活的控制流。此外,文章还介绍了jOOQ在R2DBC上的事务实现。
摘要由CSDN通过智能技术生成

从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是一个原子的 "工作单元",这是非常直观的。

你拥有你的控制流

如果你的代码中存在任何可恢复的异常,你可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值