首页 > 代码库 > 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(分布式事务管理)