TransactionScope:如果内部范围失败,如何使外部范围继续?

3

我正在构建一个使用嵌套的TransactionScopes的程序。最初,我使用了默认构造函数,但我发现当我的其中一个内部作用域失败时,一切都会失败,并且我无法继续执行。我想要的是有一个内部作用域可以失败而不停止外部作用域,但如果外部作用域失败,我希望所有内部作用域都能回滚。这是否可能?


我想要的是有一个内部作用域,可以失败而不停止外部作用域。然后外部作用域就不是一个事务。 - dursk
@mattm 好的,使用事务范围,没有可能检测到错误,回滚最后几个操作(即内部范围中的一个),然后继续处理吗?如果我去掉外部范围,因此我有一堆隔离的TransactionScopes依次执行。如果我确定需要,是否有办法回滚所有成功的操作? - ForeverNoobie
1
请查看以下链接:http://msdn.microsoft.com/zh-cn/library/ms172152(v=vs.90).aspx#Y1642 和 https://dev59.com/QnE85IYBdhLWcg3wgDzd。 - dursk
如果我考虑一个封闭嵌套事务的常见定义,我就无法理解你的说法“然后外部范围不是一个事务。”请参考这个定义:“中止嵌套事务对父事务状态没有影响”(https://docs.oracle.com/cd/E17276_01/html/gsg_xml_txn/java/nestedtxn.html)。 - Niklas Peter
1个回答

0

虽然在SQL中有事务级别的概念,看起来似乎存在嵌套事务,但实际上并非如此 - 至少不是你想象的那样(我知道,曾经遇到过类似的问题需要解决)。

实验:您可以尝试在SQL查询窗口内调用多个begin tran,询问事务级别和事务ID。级别会增加,但在每个事务中,您都会获得最外层事务的ID,因此使用最外层事务(所以TransactionScope.Requires new选项在这里并没有太大帮助)。

可能的解决方案:您想要实现的是可能的,但不完全是那种方式:您可以在内部范围中绕过事务(但必须坚持原子过程)。如果不适用于此,则必须重新考虑您正在做什么以及是否可以在不引入此复杂性的情况下解决它...

了解更多关于事务嵌套的信息,它在Oracle和SQL上的行为不同。


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