TransactionScope的层次结构

是否可以拥有事务范围的层次结构?

如果外部事务范围进行了处理,那么内部事务范围内所做的更改会发生什么变化?

我的特殊问题是我有运行具有事务范围的代码的测试代码。 当我用事务范围调用第二组代码时,我得到“无法访问已处置的对象。事务”。 可能是内部事务范围的处置也在处理外部事务范围。

我怀疑这是发生了什么。 只要底层技术支持分布式事务(如有必要),TransactionScopes就可以嵌套。 例如,如果您启动事务并更新数据库A中的某些数据,然后调用函数,并在该函数内部创建新的TransactionScope并将一些数据插入数据库B,那么内部事务使用“环境”已经开放的交易。 但是,为此,您需要运行分布式事务处理协调器(对于SQL Server)。 此外,SQL Server 2005及更高版本能够将事务作为常规事务启动,并在需要时将其提升为分布式事务,而SQL 2000将所有这些事务作为分布式事务启动,因为它没有能力宣传他们。

当您有嵌套事务时,在提交最外层事务之前,整个事务不会提交。

这里有更多信息 。

看看TransactionScopeOption; 确定嵌套事务如何与外部事务交互。

当外部事务失败时,我们将回滚所有内部事务。 如果你承诺并且在内部,并且处理外部,内部仍然向后滚动。 事实上,除非外部允许通过提交,否则内部不会提交。

你承诺外面的不是你吗? 在这里看到一篇关于此的好文章。

是的,可以有一个事务范围的层次结构。 此博客文章解释了它们的工作原理,特别是如何实例化内部事务范围以及事务如何完成和提交。

重要的是要记住事务和事务范围之间的区别 – 默认情况下(即在没有TransactionScopeOption ),即使嵌套事务范围,您也只会使用单个事务。

关于“已处置”错误消息,请参阅此问题 。