分布式系统事务 浅析
谈谈本人结合实际,对分布式系统事务的应用与理解。
我们在架构系统时,通常会做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带来大量的维护工作。