如何回滚已提交的存储过程中声明的事务,当来自JDBC的外部事务被回滚时。

3

目前我面临一个情况,我在JDBC中打开了一个事务,然后使用预处理语句调用存储过程,存储过程中也有一个事务和提交,调用完存储过程和其他一些调用后,我提交了JDBC事务。现在我想要当外部JDBC事务回滚时,已经提交的存储过程内部事务也应该回滚。

有人知道这个问题吗?谢谢!


4
一旦某件事被提交,就已经完成了,无法回滚已提交的事务。如果您需要回滚,请勿在存储过程中进行提交。 - user330315
马是对的;committed就是committed。但是,对于像你这样的用例,关系型数据库驱动程序有时会提供保存点(save points),允许您保存内部事务的状态,该状态可以单独回滚,而不会回滚外部事务。查看驱动程序的保存点支持可能会有所帮助。 - akaIDIOT
除非您的数据库真正支持嵌套事务(有些数据库确实支持),否则这将无法工作。 - user207421
基本上我对存储过程没有任何控制,是否有事务传播机制,如果外部事务失败并回滚,则即使内部事务已提交,也应该回滚? - zaffargachal
我正在开发一个支持Oracle、MySQL、Postgres和SQL Server的产品,那么这些数据库是否都可以使用呢? - zaffargachal
所有这些数据库都不支持保存点。然而,例如 PostgreSQL 支持... 如果您需要以相同的方式支持所有这些数据库,则可能需要重新考虑策略。 - Alex
1个回答

0

在这种情况下,通过JDBC桥传播事务边界是不可能的。像a_horse_with_no_name和EJP提到的那样,提交是一个提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接