首页 > 代码库 > 分布式系统事务 浅析

分布式系统事务 浅析

     谈谈本人结合实际,对分布式系统事务的应用与理解。
     我们在架构系统时,通常会做N层,分层的意义在于系统结构更清晰,易于维护,易于扩展等。我将拿四层结构举例,谈谈对分布式系统事务的实际应用。
     首先,系统四层做如下定义:模型层,数据层,业务层,服务层.
     然后,阐述四层的意义:
               模型层:作为ORM的Object,不作详细说明
               数据层:访问具体DB,实现SQL执行
               业务层:实现简单,独立业务
               服务层:实现大粒度业务,需要各业务层协作完成的业务逻辑
    实例说明,完成一个用户注册场景:
            假设,用户登录与用户基本信息存储不同的DB,DB处于不同服务器。
            完成这个逻辑,1写入数据至用户登录表,2写入数据至基本信息表;而这两个动作是完整,需保持一致性。
            
            没有采用分布式系统事务 伪代码如下:
            object bllobject1=new userbll();                       //创建一个BLL对象
            bllobject1.adduserpassport(userpassport u); //保存用户登录信息
            object bllobject2=new userbll();                       //创建一个BLL对象
            bllobject2.adduserinfo(userinfo u);                 //保存用户基本信息
             
           采用分布式系统事务 伪代码如下:
           Using  (CommittableTransaction tran=new CommittableTransaction())
                 {
                                object bllobject1=new userbll();                       //创建一个BLL对象
                                bllobject1.adduserpassport(userpassport u); //保存用户登录信息
                                object bllobject2=new userbll();                       //创建一个BLL对象
                                bllobject2.adduserinfo(userinfo u);                 //保存用户基本信息
                       try
                         { …
                                  tran.Commit();//事务提交
                         }
                       catch
                         {…
                                tran.Rollback();//事务回退
                         }
                 }

            调用服务层分布式系统事务 伪代码如下:
               class userservice {
                     void register(object user)  //注册信息类,继承userpassport , userinfo 
                            {
                                Using  (CommittableTransaction tran=new CommittableTransaction())
                                {
                                    object bllobject1=new userbll();                       //创建一个BLL对象
                                    bllobject1.adduserpassport(userpassport u); //保存用户登录信息
                                    object bllobject2=new userbll();                       //创建一个BLL对象
                                    bllobject2.adduserinfo(userinfo u);                 //保存用户基本信息
                               try
                                    { …
                                          tran.Commit();//事务提交
                                    }
                              catch
                                   {…
                                      tran.Rollback();//事务回退
                                   }
                              }  
                        }
               }
           
               调用服务层  new  userservice ().register(object user) 
   
    为实现分布式事务的一致性,还需要分DB或不同的DB驱动 做不同的配置
    MSSQL 配置MSDTC(后续跟进)
    XA可针对不同的DB(后续跟进)

       总结,很多时候,程序员喜欢写存储过程,将事务放在存储过程处理;具体情况具体处理,个人认为,不利于系统的维护,增加了数据间的偶合;对后期分库分表,优化DB带来大量的维护工作。

 

.NET+MSDTC分布式事务