【发布时间】:2009-08-26 12:34:37
【问题描述】:
是否可以有事务范围的层次结构?
如果外部事务范围进行了 dispose,内部事务范围所做的更改会发生什么变化?
我的特殊问题是我有运行具有事务范围的代码的测试代码。当我调用具有事务范围的第二组代码时,我得到“无法访问已处置的对象。事务”。难道是内部事务作用域的dispose,也就是外部事务作用域的dispose。
【问题讨论】:
标签: c# transactions transactionscope
是否可以有事务范围的层次结构?
如果外部事务范围进行了 dispose,内部事务范围所做的更改会发生什么变化?
我的特殊问题是我有运行具有事务范围的代码的测试代码。当我调用具有事务范围的第二组代码时,我得到“无法访问已处置的对象。事务”。难道是内部事务作用域的dispose,也就是外部事务作用域的dispose。
【问题讨论】:
标签: c# transactions transactionscope
我怀疑这就是正在发生的事情。如有必要,只要底层技术支持分布式事务,TransactionScopes 就可以嵌套。例如,如果您启动一个事务并更新数据库 A 中的一些数据,然后调用一个函数,在该函数内部,您创建一个新的 TransactionScope 并将一些数据插入数据库 B,然后内部事务使用“环境”已经打开的交易。但是,要使其工作,您需要运行分布式事务协调器(对于 SQL Server)。此外,SQL Server 2005 及更高版本能够将事务作为常规事务启动,并在需要时将其提升为分布式事务,而 SQL 2000 将所有这些事务作为分布式事务启动,因为它没有能力宣传他们。
当您有嵌套事务时,整个事务在提交最外层事务之前不会提交。
这里是some more info。
看看TransactionScopeOption;这决定了嵌套事务如何与外部事务交互。
【讨论】:
当外部事务失败时,我们将回滚所有内部事务。如果您提交和内部一个,并处置外部,内部仍然回滚。事实上,内部不会提交,除非外部通过提交允许它。
你犯的是外在的,不是吗?请参阅 here 以获得关于此的好论文。
【讨论】:
是的,可以有事务范围的层次结构。 This blog post 解释了它们是如何工作的,特别是内部事务范围应该如何实例化以及事务如何完成和提交。
记住事务和事务作用域之间的区别很重要——默认情况下(即在没有TransactionScopeOption的情况下)你只会使用一个即使您嵌套了事务范围,也可以进行事务。
关于“disposed”错误信息,见this question。
【讨论】: