我试图了解TransactionScope的细节。 以下引自here:
本主题中的某些过程使用System.Transactions中的类型 部件。在您遵循这些程序之前,您必须确保这样做 分布式事务处理协调器服务正在运行 运行单元测试的计算机。否则,测试失败,并且 出现以下错误消息:“测试方法 ProjectName.TestName.MethodName抛出异常: System.Data.SqlClient.SqlException:服务器'ComputerName'上的MSDTC是 不可用”。
但奇怪的是,我停止了该服务,并在TransactionScope中删除了一些数据库,并且最后没有调用Complete()方法,这意味着事务应该回滚。
DB确实没有受到影响。交易似乎仍然运作良好。
据我了解,我们需要资源管理器(RM)和事务管理器(TM)才能使资源上的事务发生。在我的方案中,分布式事务协调器服务已停止,那么谁是事务管理器?
答案 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),很有可能避免升级。总的来说,这是一件好事,因为它在性能方面可以很省钱。