谈谈本人结合实际,对分布式系统事务的应用与理解。
    
 我们在架构系统时,通常会做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带来大量的维护工作。
原文:http://www.cnblogs.com/bobsoft/p/3731886.html