首页 > 代码库 > ADO.NET中的TransactionScope何时需要启用MSTDC(分布式事务管理)

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(分布式事务管理)