java - 使用 JDBC 3.0 实现对嵌套事务的支持

标签 java jdbc transactions

我们的旧应用程序使用 JDBC 3.0。它通过实现自己的事务管理器来支持事务,该事务管理器能够为每个线程返回相同的 JDBC 连接。我最近发现的问题是它不支持嵌套事务:如果一个事务在另一个事务中启动,那么在内部事务上下文中运行的每个 SQL 都将使用相同的数据库连接执行,并且当它被提交或回滚它会自动提交或回滚从外部事务开始的所有更改。

据我所知,我可以使用 JDBC 3.0 保存点实现对嵌套事务的支持:每当启动嵌套事务时,我都可以为当前连接设置一个新的保存点。之后,如果嵌套事务回滚,我将回滚到这个保存点。另一方面,如果我 promise 了,我就什么也不做。只有最外层事务的提交才会将更改保存到数据库。

这是正确的吗?这种方法有什么缺陷吗?如果是,我的可能性是什么?

谢谢。

最佳答案

代码中可能存在期望完成提交而不是推迟提交的依赖项(例如,如果隔离级别设置为 TRANSACTION_READ_COMMITTED)。

考虑修复事务管理器以在单独的连接上执行嵌套事务。

更新:看起来像the Spring framework使用 SavePoints 提供嵌套事务。我的猜测是他们只是忽略了隔离模式的问题。

关于java - 使用 JDBC 3.0 实现对嵌套事务的支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/521669/

相关文章:

.net - 同一事务中的并发数据库 (PostgreSQL) 命令

java - 为什么我不能在 MySQL 的准备语句中设置变量?

java - 提高查询处理速度

java - 如何从 Java JDBC-ODBC 桥访问 UniqueIdentifier 列

mysql - 是否可以不用程序进行mysql事务?

mysql - MySQL Innodb 中的悬空事务

java - 如何添加新 child 而不覆盖其他 child

java - 如何使用 joda 时间将以毫秒为单位的 UTC 时间转换为不同时区的格式化日期时间?

java - 使用JDBC和MySQL解决“通信链接失败”问题

java - 为什么 JDBC 驱动程序会在 Oracle 数据库中填充一些空白字符而不是查询字段?