ADO.NET中的TransactionScope何时需要启用MSTDC(分布式事务管理)

Posted PowerCoder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ADO.NET中的TransactionScope何时需要启用MSTDC(分布式事务管理)相关的知识,希望对你有一定的参考价值。

我们知道在ADO.NET中可以用TransactionScope来将多个SqlConnection(多个数据库连接)执行的Sql语句放入一个事物中提交或取消,但是使用TransactionScope的时候也要额外小心,因为当TransactionScope在特殊情况下需要启动MSTDC(分布式事务管理),那么我们来看看什么时候TransactionScope需要启动MSTDC呢?

 

首先来声明下本例中代码和数据库的环境,首先本例中C#代码运行的电脑和SqlServer数据库所在的电脑是局域网中的两个机器,也就是说ADO.NET所在的程序和SqlServer是在两台电脑上,为什么要强调这个问题呢?因为我查阅文章发现ADO.NET所在的程序和SqlServer部署在一台电脑,和部署在两台电脑上,TransactionScope的行为还不太一样,这个也和SqlServer的版本有关系,后面会有总结。

 

我们先来看一个例子,在下面的客户端程序代码中我们使用TransactionScope启动了两个SqlConnection,这两个SqlConnection使用的连接字符串都相同,而此时我们的客户端程序所在的电脑是没有启动MSTDC,所以如果TransactionScope需要启动MSTDC那么下面这段代码就会抛出异常。

 1 protected const string connectionString = @"Data Source=192.168.1.3;Initial Catalog=Mobile_Reporting_DM_Staging;Persist Security Info=True;User ID=sa;Password=0okm9ijn*UHB&YGV";
 2 
 3 static void Main(string[] args)
 4 {
 5     string sql = string.Empty;
 6     SqlCommand sqlCom;
 7 
 8     using (TransactionScope tran = new TransactionScope(TransactionScopeOption.RequiresNew))
 9     {
10         using (SqlConnection sqlCon1 = new SqlConnection(connectionString))
11         {
12             sqlCon1.Open();
13 
14             sql = "insert into [dbo].[T_People](Name,age) values(N‘王刚‘,20)";
15 
16             sqlCom = new SqlCommand(sql, sqlCon1);
17             sqlCom.ExecuteNonQuery();
18         }
19 
20         using (SqlConnection sqlCon2 = new SqlConnection(connectionString))
21         {
22             sqlCon2.Open();
23 
24             sql = "insert into [dbo].[T_People](Name,age) values(N‘李强‘,30)";
25 
26             sqlCom = new SqlCommand(sql, sqlCon2);
27             sqlCom.ExecuteNonQuery();
28         }
29 
30         tran.Complete();
31     }
32 
33     Console.ReadLine();
34 }

而执行上面这段代码后我们发现程序并没有出现异常,而且两个SqlConnection都成功地向数据库中插入了一条数据,这说明上面这段代码TransactionScope并没有用到MSTDC服务。这说明如果TransactionScope中启动的多个SqlConnection(多个数据库连接)连接的同一个SqlServer实例的相同数据库,那么TransactionScope是不会启动MSTDC服务的。

 

然后我们将上面的代码做一下修改,定义两个连接字符串TransactionScope中的两个SqlConnection

 

以上是关于ADO.NET中的TransactionScope何时需要启用MSTDC(分布式事务管理)的主要内容,如果未能解决你的问题,请参考以下文章

ADO.NET 中的新增功能

asp.net中的ADO.NET实体框架适用于不同的数据库及其性能

将动态表传递给 SSIS 中的 ADO.NET 目标

ADO.NET(课程学习内容)

使用 ADO.NET 命令向 VB 中的 SQL 表添加列

参数缓存如何提高 ADO.NET 中的性能?