java - Jdbi3 是否保证每种异常类型的事务回滚?
问题描述
我有这样的代码:
jdbi.inTransaction(h -> {
Dao1 dao1 = h.attach(Dao1.class);
if(!dao1.somequery()) {
throw new CustomException("foobar");
}
// ... other statements
}
我可以确定 ifCustomException
被抛出jdbi
会回滚事务,或者这只发生在SQLException
Jdbi 相关的 Exceptions 中吗?
解决方案
介绍
让我们考虑一下 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。
请看一下整个测试班。
那么,请注意以下与异常相关的测试方法:
testExceptionAbortsTransaction()
.testExceptionAbortsUseTransaction()
.
我们可以从这些测试方法的实现中检查:
- 实现使用
java.io.IOException
异常类型。 - 实现没有提到异常处理行为取决于异常类型。
推荐阅读
- python - 在 Discord PY 中使用 discord.utils.find 的正确方法
- c++ - 使用 Cmake 链接到 Facebook 的 Proxygen 而无需全局安装
- python - 如何在我的 QmainWindow 小部件中添加媒体播放器?
- node.js - Bitbucket CI/CD 管道中的 npm 安装错误
- python - Simpy中默认时间系统的解读
- python - 枕头:无法将“P”转换为“RGB”
- node.js - 节点 IMAP - 如何存储 IMAP 连接?
- python - 通过添加列组创建新列
- c++ - c++20个概念构造函数重载
- javascript - 我将如何创建水平滚动条效果?