首页 > 解决方案 > Jdbi3 是否保证每种异常类型的事务回滚?

问题描述

我有这样的代码:

jdbi.inTransaction(h -> {
            
            Dao1 dao1 = h.attach(Dao1.class);
            
            if(!dao1.somequery()) {
                
                throw new CustomException("foobar");
            }

            // ... other statements
}

我可以确定 ifCustomException被抛出jdbi会回滚事务,或者这只发生在SQLExceptionJdbi 相关的 Exceptions 中吗?

标签: javasqljdbijdbi3

解决方案


介绍

让我们考虑一下 Jdbi 3.27.0。

文档

请参阅Javadoc以了解该org.jdbi.v3.core.Jdbi#inTransaction(org.jdbi.v3.core.HandleCallback<R,X>)方法:

交易中

public <R, X extends Exception > R inTransaction ( HandleCallback <R,X> callback) throws X

一个方便的函数,它管理句柄的生命周期并将其交给回调以供客户端使用。当回调被调用时,句柄将在一个事务中,如果回调正常完成,则该事务将被提交,如果回调引发异常,则该事务将回滚。

类型参数:

R- 回调返回的类型

X- 回调抛出的异常类型,如果有的话。

参数:

callback- 在事务中接收打开句柄的回调

回报:

回调返回的值

抛出:

X- 回调抛出的任何异常

请注意以粗体标记的文本,它应该回答您的问题:

当回调被调用时,句柄将在一个事务中,如果回调正常完成,则该事务将被提交,如果回调引发异常,则该事务将回滚

抛出:

X-回调抛出的任何异常

正如我们所看到的,没有声明声称异常处理行为取决于异常类型。

源代码

请将本节中提供的信息视为草稿:它可能很粗略(不精确)。

有一些测试涵盖了与交易相关的功能。
测试由TestTransactions类表示:jdbi/TestTransactions.java at v3.27.0 · jdbi/jdbi

请看一下整个测试班。

那么,请注意以下与异常相关的测试方法:

  1. testExceptionAbortsTransaction().
  2. testExceptionAbortsUseTransaction().

我们可以从这些测试方法的实现中检查:

  1. 实现使用java.io.IOException异常类型。
  2. 实现没有提到异常处理行为取决于异常类型。

推荐阅读