java - spring事务传播 - spring嵌套事务




使用JDBC 3.0实现对嵌套事务的支持 (2)

事务有点棘手,不能真正从JDBC层查看,而是底层数据库本身。 我会从这里谈论甲骨文,因为这是我最有经验的。 在Oracle中,如果启动事务,则可以回滚到事务中的保存点,但不能使用保存点进行提交。 假设我开始一个事务,并有三个保存点A,B和C.我可以愉快地前进并回滚到A,B或C,但是一旦你提交了,就开始了一个新的事务,现在A,B ,和C不再有效。 我希望这有助于回答你的问题。

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

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

它是否正确? 这种方法是否有缺陷? 如果是,我有什么可能?

谢谢。


在代码中可能存在依赖关系,而这些依赖关系需要执行而不是延迟(例如,如果隔离级别设置为TRANSACTION_READ_COMMITTED)。

考虑修复你的事务管理器在一个单独的连接上进行嵌套事务。

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







transactions