我们的旧应用程序使用 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/