是否可以拥有交易范围的层次结构?
如果外部事务范围进行了处理,那么内部事务范围内所做的更改会发生什么?
我的特殊问题是我有运行具有事务范围的代码的测试代码。当我用事务范围调用第二组代码时,我得到“无法访问已处置的对象。事务”。可能是内部事务范围的处置也在处理外部事务范围。
答案 0 :(得分:3)
我怀疑这是发生了什么。只要底层技术支持分布式事务(如有必要),TransactionScopes就可以嵌套。例如,如果您启动一个事务并更新数据库A中的某些数据,然后调用一个函数,并在该函数内部创建一个新的TransactionScope并将一些数据插入数据库B,那么内部事务使用“环境”已经开放的交易。但是,为此,您需要运行分布式事务处理协调器(对于SQL Server)。此外,SQL Server 2005及更高版本能够将事务作为常规事务启动,并在需要时将其提升为分布式事务,而SQL 2000将启动它们作为分布式事务,因为它没有能力宣传他们。
当您有嵌套事务时,在提交最外层事务之前,整个事务不会提交。
看看TransactionScopeOption;确定嵌套事务如何与外部事务交互。
答案 1 :(得分:2)
当外部交易失败时,我们将回滚所有内部交易。如果你承诺并且在内部,并且处理外部,内部仍然向后滚动。事实上,除非外部允许通过提交,否则内部不会提交。
你承诺外面的不是你吗?有关此问题的详细论文,请参阅here。
答案 2 :(得分:1)
是的,可以有一个事务范围的层次结构。 This blog post解释了它们是如何工作的,特别是如何实例化内部事务范围以及事务如何完成&提交。
重要的是要记住事务和事务范围之间的区别 - 默认情况下(即在TransactionScopeOption
的缺席中),您只会利用即使您嵌套事务范围,也只需要一个事务。
关于“已处置”错误消息,请参阅this question。