TransactionScope的层次结构

时间:2009-08-26 12:34:37

标签: c# transactions transactionscope

是否可以拥有交易范围的层次结构?

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

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

3 个答案:

答案 0 :(得分:3)

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

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

这是some more info

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

答案 1 :(得分:2)

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

你承诺外面的不是你吗?有关此问题的详细论文,请参阅here

答案 2 :(得分:1)

是的,可以有一个事务范围的层次结构。 This blog post解释了它们是如何工作的,特别是如何实例化内部事务范围以及事务如何完成&提交。

重要的是要记住事务和事务范围之间的区别 - 默认情况下(即在TransactionScopeOption的缺席中),您只会利用即使您嵌套事务范围,也只需要一个事务。

关于“已处置”错误消息,请参阅this question

相关问题