美文网首页
.NET分布式事务--TransactionScop

.NET分布式事务--TransactionScop

作者: 单程车票_SJ | 来源:发表于2020-11-24 10:31 被阅读0次

    概述

       SqlTransaction可以解决同一个数据库的事务控制,但是,不能解决不同数据库的事务控制,今天就说一说,这个的解决方法,即:TransactionScope的应用。
    
        本篇博客的的思路就是先进行一些相应的配置(开启DTC服务,配置MSDTC,配置防火墙,配置数据库管理系统),然后再进行一个实例的展示(代码),最后进行简单原理的介绍和总结。
    
        了解了本篇博客的流程和结构后,接下来就看相应具体的内容吧!
    

    开启DTC服务

    方式一

        计算机—管理—服务—Distributed(分布式)Link Tracking Client—属性—开启
    

    方式二

        字符命令子界面输入:net start msdtc
    

    设置MSDTC

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

    image

    防火墙设置

       有两种方法:1、直接关闭防火墙(不建议使用,以前数据库连接的时候这样干过);2、进行如下图的设置
    
    image

    数据库管理系统设置

       因为要实现多个数据库系统之间事务的控制,所以,数据库系统也需要做相应的设置,具体如下图。
    
    image

    代码

       下面是一个简单的Demo,实现了两个功能:1、同一数据库系统,不同数据库的事务控制;2、不同数据库系统的事务控制。
    

    控制台代码

    using System;using System.Collections.Generic;
    using System.Linq;using System.Text;using System.Threading.Tasks;
    using System.Transactions; 
    namespace 事务.分布式
    {    
    class Program    
    {        
    static void Main(string[] args)        
    {            
    #region 同一个数据库服务器,操作不同的数据库            
    //using (TransactionScope tran = new TransactionScope())            
    //{            
    //    OperateDataBase operateDataBase = new OperateDataBase();            
    //    int i = operateDataBase.Execute1();            
    //    int j = operateDataBase.Execute2();           
     //    tran.Complete();            
    //}              
    #endregion             
    #region 不同的数据库服务器            
    using (TransactionScope tran = new TransactionScope())           
     {                                 
    OperateDifferentDataBaseServer operateDifferentDataBaseServer = new OperateDifferentDataBaseServer();                
    int i = operateDifferentDataBaseServer.Execute1();                
    int j = operateDifferentDataBaseServer.Execute2();                
    tran.Complete();               
    }            
    #endregion        
    }   
     }}
    

    OperateDataBase.cs类(同一数据库服务器,不同数据库)

    using System;using System.Collections.Generic;
    using System.Linq;using System.Text;
    using System.Threading.Tasks;
    using System.Data;
    using System.Data.SqlClient;
    using System.Configuration; 
    namespace 事务.分布式
    {    
    public class OperateDataBase    
    {        
    private SqlConnection sqlCon1;        
    private SqlConnection sqlCon2;        
    private SqlCommand sqlCom;         
    #region 数据库系统1—数据库1—连接对象        
    private void GetConnection1() {            
    if (sqlCon1 == null)            
    {                
    sqlCon1 = new SqlConnection(ConfigurationManager.ConnectionStrings["strCon1"].ToString());            
    }            
    if (sqlCon1.State == ConnectionState.Closed)            
    {                
    sqlCon1.Open();            
    }       
    }        
    #endregion         
    #region 数据库系统1—数据库2—连接对象        
    private void GetConnection2() {            
    if (sqlCon2 == null)           
     {                
    sqlCon2 = new SqlConnection(ConfigurationManager.ConnectionStrings["strCon2"].ToString());            
    }            
    if (sqlCon2.State == ConnectionState.Closed)            
    {               
     sqlCon2.Open();           
     }       
     }        
    #endregion         
    #region 数据库系统1—数据库1—添加数据        
    public int Execute1()
     {            
    GetConnection1();            
    sqlCom = new SqlCommand("insert into DataTable2(id,name) values(1,'张三')");            
    sqlCom.Connection = sqlCon1;            
    return sqlCom.ExecuteNonQuery();        
    }        
    #endregion         
    #region 数据库系统1—数据库2—添加数据        
    public int Execute2() {            
    GetConnection2();            
    sqlCom = new SqlCommand("insert into DataTable2(id,name) values(1,'李四')");            
    sqlCom.Connection = sqlCon2;            
    return sqlCom.ExecuteNonQuery();        
    }        
    #endregion    
    }}
    

    OperateDifferentDataBaseServer.cs(不同数据库系统)

    using System;using System.Collections.Generic;
    using System.Linq;using System.Text;using System.Threading.Tasks;
    using System.Data;using System.Data.SqlClient;
    using System.Configuration; 
    namespace 事务.分布式
    {    
    public class OperateDifferentDataBaseServer    
    {        
    private SqlConnection sqlCon1;        
    private SqlConnection sqlCon2;        
    private SqlCommand sqlCom;         
    #region 数据库服务器系统1—数据库连接对象        
    private void GetConnection1()        
    {            
    if (sqlCon1 == null)            
    {                
    sqlCon1 = new SqlConnection(ConfigurationManager.ConnectionStrings["strConS1"].ToString());            
    }           
     if (sqlCon1.State == ConnectionState.Closed)            
    {                
    sqlCon1.Open();           
     }        
    }        
    #endregion                
    #region 数据库服务器系统2—数据库连接对象        
    private void GetConnection2()       
     {            
    if (sqlCon2 == null)           
     {                
    sqlCon2 = new SqlConnection(ConfigurationManager.ConnectionStrings["strConS2"].ToString());            
    }            
    if (sqlCon2.State == ConnectionState.Closed)            
    {                
    sqlCon2.Open();            
    }        
    }        
    #endregion         
    #region 数据服务器系统1—添加数据        
    public int Execute1()       
     {            
    GetConnection1();            
    sqlCom = new SqlCommand("insert into DataTable2(id,name) values(17,'张三')");            
    sqlCom.Connection = sqlCon1;            
    return sqlCom.ExecuteNonQuery();        
    }        
    #endregion         
    #region 数据库管理系统2—添加数据         
    public int Execute2()       
     {            
    GetConnection2();            
    sqlCom = new SqlCommand("insert into DataTable2(id,name) values(17,'李四')");            
    sqlCom.Connection = sqlCon2;            
    return sqlCom.ExecuteNonQuery();        
    }        
    #endregion    
    }}
    
       配置文件的代码和数据库代码,可以通过阅读上面的代码,自己写出来,这里就不提供了
    

    简单原理的介绍

       我们系统在多台计算机上,那么,到底哪些机子需要进行上面的配置呢?这里大致说一下它的原理。
    
       要想实现A机上运行代码,并且通过代码实现事务控制B机和C机上的数据库系统,那么,最基本的一点,A机要能和B机和C机进行一些特殊的交流,这个交流的实现就依赖于相应的服务,即我们要开启相应的服务,这个服务不是简单的开启,需要我们进行一些设置,开启服务后,我们还要告诉防火墙,你给我放行这个口或这个程序,这些完成后,我们再需要做的就是进行数据库系统的设置,最后做的就是相应的编程了。
    

    总结

       下图是关于TransactionScope的总结图
    
    image

    相关文章

      网友评论

          本文标题:.NET分布式事务--TransactionScop

          本文链接:https://www.haomeiwen.com/subject/gzciiktx.html