我正在构建一个使用嵌套的TransactionScopes
的程序。最初,我使用了默认构造函数,但我发现当我的其中一个内部作用域失败时,一切都会失败,并且我无法继续执行。我想要的是有一个内部作用域可以失败而不停止外部作用域,但如果外部作用域失败,我希望所有内部作用域都能回滚。这是否可能?
我正在构建一个使用嵌套的TransactionScopes
的程序。最初,我使用了默认构造函数,但我发现当我的其中一个内部作用域失败时,一切都会失败,并且我无法继续执行。我想要的是有一个内部作用域可以失败而不停止外部作用域,但如果外部作用域失败,我希望所有内部作用域都能回滚。这是否可能?
虽然在SQL中有事务级别的概念,看起来似乎存在嵌套事务,但实际上并非如此 - 至少不是你想象的那样(我知道,曾经遇到过类似的问题需要解决)。
实验:您可以尝试在SQL查询窗口内调用多个begin tran,询问事务级别和事务ID。级别会增加,但在每个事务中,您都会获得最外层事务的ID,因此使用最外层事务(所以TransactionScope.Requires new选项在这里并没有太大帮助)。
可能的解决方案:您想要实现的是可能的,但不完全是那种方式:您可以在内部范围中绕过事务(但必须坚持原子过程)。如果不适用于此,则必须重新考虑您正在做什么以及是否可以在不引入此复杂性的情况下解决它...
了解更多关于事务嵌套的信息,它在Oracle和SQL上的行为不同。