.NET分布式事务--TransactionScop

一、开启DTC服务

方式一

     计算机—管理—服务—Distributed Transaction Coordinator—属性—开启

方式二

    CMD命令子界面输入:net start msdtc

二、设置MSDTC

CMD命令界面输入:dcomcnfg.exe(或者:控制面板—管理工具—组件服务)

组件服务--计算机--我的电脑--Distributed Transaction Coordinator-本地DTC

三、

防火墙设置
设置例外程序“C:WindowsSystem32msdtc.exe”


四、数据库管理系统设置
数据库系统的设置,具体如下图。

右键 实例 属性

五、代码

DAL层代码

public static bool ExecuteSqlTranScope(List<SqlCommand> cmdList)
        {
            int rows = 0;
            try
            {
                using (System.Transactions.TransactionScope tsCope = new System.Transactions.TransactionScope())
                {
                    foreach (SqlCommand cmd in cmdList)
                    {
                        cmd.Connection.Open();
                        PrepareCommand(cmd, cmd.Connection, null, CommandType.Text, cmd.CommandText, cmd.Parameters);
                        rows += cmd.ExecuteNonQuery();
                    }
                    tsCope.Complete();
                }
                if (rows > 0)
                    return true;
                else
                    return false;
            }
            catch
            {
                return false;
            }
        }

调用

List<System.Data.SqlClient.SqlCommand> cmdList = new List<System.Data.SqlClient.SqlCommand>();

string connectStr = "data source=192.168.1.221;initial catalog=db;persist security info=True;user id=sa;password=123456;";

string connectStr2 = "data source=192.168.1.221;initial catalog=db;persist security info=True;user id=sa;password=123456;";

string sql = "INSERT INTO [SYS_USER_ADMIN]([FID],[LANGUAGEID],[LOGIN],[PASSWORD],[NAME],[CREATEMAN],[CREATEDATE],[MODIFYMAN],[MODIFYDATE],[UPDATETIME])VALUES (NEWID(),1,'TEST','TEST','TEST','',GETDATE(),'',GETDATE(),GETDATE())";

string sql2 = "INSERT INTO [SYS_USER_ADMIN]([FID],[LANGUAGEID],[LOGIN],[PASSWORD],[NAME],[CREATEMAN],[CREATEDATE],[MODIFYMAN],[MODIFYDATE],[UPDATETIME])VALUES (NEWID(),1,'TEST2','TEST2','TEST2','',GETDATE(),'',GETDATE(),GETDATE())";

cmdList.Add(new System.Data.SqlClient.SqlCommand(sql, new System.Data.SqlClient.SqlConnection(connectStr)));

cmdList.Add(new System.Data.SqlClient.SqlCommand(sql2, new System.Data.SqlClient.SqlConnection(connectStr2)));

SqlHelper.ExecuteSqlTranScope(cmdList);

其他错误情况:

错误1:(前提是程序和数据库 不在同一个服务器时)已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。 

需要设置程序服务器的DTC 


错误2: 该事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D024) 

需要设置数据库服务器的DTC

错误3:与基础事务管理器的通信失败

需要设置程序服务器的DTC 防火墙问题

参考 http://wenku.baidu.com/link?url=ps4eSRpjF6TVy0tY7jCHSSOv1SmE4wzpDnxsBmy7C21FcFgb1mJySCCf82-fUASTD12f1C_7VhKIryEFCaWLA7ZS4UwRcMlOumWmY7KNISG

原文地址:https://www.cnblogs.com/hakuci/p/5301729.html