一、分布式事务产生的原因
在传统的单体应用中,即使应用有多个模块,这多个模块使用一个数据源,不存在分布式事务的问题。当随着需求的变化,单体应用已不能满足我们的需要,单体应用被拆分为微服务系统,多个模块被拆分为单独的应用服务,每个应用都用独自的数据库事务。这样,服务之间的数据一致性就无法保证。我们需要分布式的事务来保障全局的事务一致性。
二、分布式事务的解决方案
1.基于XA协议的两阶段提交
XA是一个分布式事务协议,XA包含两个部分:事务管理器和资源管理器。资源管理器由数据库实现,但是在mysql5.7之前的版本不支持XA协议;事务管理器作为全局的调度者,负责各个本地资源的提交和回滚。XA两端提交原理如下:
第一阶段:
1.事务管理器通知各个事务的资源管理器开始准备事务。
2.资源管理器收到通知后进入准备阶段,写好事务日志并执行事务,但是不提交事务,只是将准备就绪的消息返回给事务管理器。
第二阶段:
1.事务管理器在接收各个资源管理器消息后开始进行分析,如果有任意一个失败,则发送事务回滚命令,否则发送提交命令。
2.资源管理器在收到事务管理器的消息后,提交事务,并将提交信息返回给事务管理器。
XA分布式事务比较简单,成本比较低,但是性能比较差,无法满足高并发的业务场景。
2.基于消息中间件的事物+最终一致性
基于消息中间件的事务,主要是通过将本地事务和消息发送放在一个事务里面,保证本地事务成功而且消息发送成功,否则的话两者都失败,事务进行回滚。如下图:
1.1.A系统向消息中间件发送预备消息,一旦出错A系统的操作不会执行
1.2.消息中间件保存预备消息并返回成功,失败则A系统的操作不执行
2.A系统执行本地事务,如果失败则回滚事务
3.向消息中间件发送消息,消息中间件收到消息后先保存消息,然后发送给B系统,由B系统执行本地事务,若消息中间件保存消息成功则A系统事务一定成功
4.消息中间件执行回调接口给A系统发送消息,若系统成功收到回调消息,则证明B系统的事务也是成功的,这样就实现了最终一致性。
消息中间件的解决方案虽然提高了系统性能,但是事务不是严格一致的,如果B系统执行失败,A系统事务无法回滚。此外对消息中间件依赖较大,万一消息中间件不可用将会导致所有的业务都无法进行。
3.TCC模式
TCC模式是由业务系统来实现的,通过对业务逻辑的调度来实现分布式事务,主要由三个操作组成:try,confirm,cancle。try:尝试执行业务,confirm:确认执行业务,cancle:取消执行业务。
TCC模式对代码的嵌入性高,要求每个业务都要写这三步代码,事务一致性由开发者来控制,业务开发难度比较高。
4.TXC模式
TXC模式为阿里开源的GTS项目中命名的模式,项目地址:https://github.com/alibaba/fescar/wiki/%E6%A6%82%E8%A7%88,TXC模式和XA协议有点类似,主要原理如下:
Transaction Coordinator (TC): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
Transaction Manager (TM): 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
1.TM向TC申请开启一个全局事务,全局事务创建成功,并生成一个全局唯一的xid;
2.xid在微服务的调用链上下文中传播;
3.RM向TC注册分支事务,将其纳入XID对应的全局事务的管辖中;
4.TM向TC发起针对XID的全局事务的提交或者回滚决议;
5.TC调度XID下管辖的全部分支事务来完成事务的提交或者回滚。
TXC模式极大的减少了分支事务对资源的锁定时间,提高了并发的性能。
5.LCN模式
LCN模式是通过代理Connection的方式实现对本地事务的操作,然后在由TxManager统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。详见:https://www.txlcn.org/zh-cn/docs/principle/lcn.html
该模式对代码的嵌入性低,仅限于本地存在连接对象且可通过连接对象控制事务的模块。缺陷在于代理的连接需要随事务发起方一共释放连接,增加了连接占用的时间。
参考:
https://www.cnblogs.com/zengkefu/p/5742617.html
https://www.txlcn.org/zh-cn/docs/preface.html
https://blog.csdn.net/ggibenben1314/article/details/48812501
https://github.com/alibaba/fescar/wiki/%E6%A6%82%E8%A7%88