TransactionScope真的需要运行“分布式事务协调器”服务吗?

时间:2013-12-24 07:05:40

标签: sql-server transactions transactionscope

我试图了解TransactionScope的细节。 以下引自here

  

本主题中的某些过程使用System.Transactions中的类型   部件。在您遵循这些程序之前,您必须确保这样做   分布式事务处理协调器服务正在运行   运行单元测试的计算机。否则,测试失败,并且   出现以下错误消息:“测试方法   ProjectName.TestName.MethodName抛出异常:   System.Data.SqlClient.SqlException:服务器'ComputerName'上的MSDTC是   不可用”。

但奇怪的是,我停止了该服务,并在TransactionScope中删除了一些数据库,并且最后没有调用Complete()方法,这意味着事务应该回滚。

DB确实没有受到影响。交易似乎仍然运作良好。

据我了解,我们需要资源管理器(RM)和事务管理器(TM)才能使资源上的事务发生。在我的方案中,分布式事务协调器服务已停止,那么谁是事务管理器?

enter image description here

2 个答案:

答案 0 :(得分:0)

当您使用TransactionScope时,您正在使用ambient transaction,并且您的代码中的交易是独立管理的。

TransactionScope类由msdn定义为:

  

使代码块具有事务性。这个类不能被继承。

     

...

     

通过新语句实例化TransactionScope时,   事务管理器确定要参与的事务。   一旦确定,范围始终参与该交易。   该决定基于两个因素:是否是环境交易   是否存在以及TransactionScopeOption参数的值   构造函数。环境事务是您的代码的事务   执行。您可以通过获取对环境事务的引用   调用Transaction类的静态Current属性。

同样来自msdn

  

TransactionScope类提供了一种标记块的简单方法   代码参与交易,无需您   与交易本身互动。事务范围可以选择   并自动管理环境交易。

同样来自msdn

  

TransactionScope对象有三个选项:

     
      
  • 加入环境事务,或者如果不存在则创建一个新事务。
  •   
  • 成为新的根范围,即启动一个新事务,并将该事务作为其自身范围内的新环境事务。
  •   
  • 根本不参与交易。结果没有环境交易。
  •   

答案 1 :(得分:0)

只有在事务升级时才需要DTC服务。在此处详细了解:Transaction Management Escalation

升级可能很难事先确定,因为设计,这是非常自动的,但很酷,但有时会出乎意料。但是,基本上,如果您在单个SQL Server上运行事务(不是SQL 2000,我认为您至少需要SQL 2005或升级总是发生,请参阅此链接:TransactionScope: transaction escalation behavior)实例(一个“资源管理器”) / RM),很有可能避免升级。总的来说,这是一件好事,因为它在性能方面可以很省钱。