分布式事务的本质上就是保证不同数据库的数据一致性。简单来说,就是一次全局性质的事务由不同的几个小事务完成,当然这些小事务都是分布在不同的服务器上并且是不同的系统,分布式事务就是保证这些小事务要么全部成功,要么全部取消。
分布式事务的三种解决方案
基于XA协议的两阶段提交
XA协议分为两个步骤:事务管理器和本地资源管理器。
第一阶段是准备阶段,就是所有的事务参与者准备执行事务并且锁定资源的时候,向事务管理器发送就绪状态。
第二阶段为提交阶段,此时事务管理器确认所有事务参与者全部为就绪状态后,向所有参与者发送提交命令。
缺点:效率低下,准备阶段的成本持久,全局事务状态的成本持久,性能与本地事务相差10倍左右;
提交前,出现故障难以恢复和隔离问题。
消息事务+最终一致性
消息事务就是基于消息中间件的两段提交,单条消息的事务就不说了,有兴趣的同学可以看一些消息确认机制。当A系统接受到请求后,在处理完请求后发送一条MQ消息,B系统再监听MQ消息,并更改为手动消息确认,此时会变相的实现A、B系统的分布式事务。
由于A、B系统不是严格一致性,而是最终一致性的,牺牲了一致性。
优点:提高了处理性能。
缺点:如果B系统一直执行不成功,那一致性就会被破坏。
TCC编程模式
TCC是一种比较成熟的分布式事务解决方案,可用于解决跨库操作的数据一致性问题。
TCC是服务化的两阶段编程模型,其中Try,Confirm,Cancel3个方法均由业务编码实现;
其中Try操作第一阶段,资源的检查和预留,
Confirm操作第二阶段,提交操作,执行真正的业务。
Cancel是预留资源的取消。
个人感觉就是XA的加强版,具体描述如下图:
LCN框架实现了springCloud 分布式事务的TCC编程模式,详情请查看链接:https://blog.youkuaiyun.com/gaowenhui2008/article/details/83824280