刚性分布式事务:强一致性(cp)
柔性分布式事务(使用多):最终一致性(ap,补偿/通知)
刚性事务模型:xa,2pc(两阶段提交又称2PC(two-phase commit protocol))
柔性事务模型:补偿类2(TCC、saga),通知类2(事务消息、最大努力通知事务)
注:saga与事务通知重点介绍
提到刚性分布式事务,首先想到的是2pc,在2pc之前首先应了解XA模型,刚性事务满足传统事务的ACID(ACID介绍: 传送门)
柔性事务对ACID的CI进行了取舍,刚性分布式事务由于性能差,在实际应用中使用很少,除非是对事务要求极为苛刻的金融公司,如蚂蚁金服大量使用2pc
XA模型仅仅是定义了规范,使用的时候需要各个厂自己实现。目前XA具有很大性能问题,几乎没人用。 且只能用XA事务连接池,不能用jdbc
1.XA由AP、RM、TM组成:
基于xa模式的2pc实现时序图:
两阶段提交2PC是XA模型的实现,AP发起commit请求,TM发起prepare投票,RM进行串行投票,都同意后,TM再commit,如果commit过程出现宕机等异常,节点服务重启后,根据XA recover再次进行commit补偿。
缺点(响应延时高、并发低):
3pc是2pc的优化,不是严格的XA规范,解决脑裂引起的事务状态不确定问题,引入了超时和对齐(根据上次的结果,默认执行)的概念。如TM约定,5秒后提交事务,等待5秒,然后提交事务,如果存在未收到状态的RM,默认对齐。sql层面是,01解析sql,02记undo/redo,03提交事务。3pc比2pc多引入一个阶段,仅仅解决的是2pc因脑裂带来的事务状态丢失的问题(这是小缺陷),对于2pc的大缺陷(同步、并发低)一个也没解决,2pc还有很少的人用,3pc几乎根本没人用。
刚性分布式事务由于性能差(高延时、低吞吐量),在实际应用中使用很少,除非是对事务要求极为苛刻的金融公司,如蚂蚁金服大量使用2pc,在互联网高并发的要求下,2pc这类的刚性分布式事务根本无法满足我们的需求,因此出现的如TCC、saga类的柔性分布式事务。刚性事务在业内估计占有10%-20%
柔性分布式事务是对XA的妥协,降低对一致性的要求,从而降低数据库资源(RM)的锁定时间,提高性能。cap选取ap柔性分布式事务,而柔性分布式事务的落地理论就是base理论。base理论传送门
理论神器、初学者天堂、实践废物,对业务侵入性很大。TCC07年提出,09年引入国内
空回滚
。可借鉴XA引入TM(记录xid、事务状态等信息)防悬挂
。可借鉴XA引入TM(记录xid、事务状态等信息)服务幂等
,服务幂等是分布式系统的必备要求。
tcc是三步,首先try如果失败就回滚;saga是两步,直接execute,正常就结束了,异常就调用补偿模块,补偿模块可能复用(巨大的优化);saga也是串行化的?saga的串行与xa模式的串行不一样,saga的每个本地事务执行后都会提交,xa模式每个本地事务执行后不会提交,而是挂起。
saga的隔离性:
saga的补偿模块:
saga的问题:
tcc与saga的cancal与补偿可以异步,fastfail
,三次补偿失败就上人工智能(人)
事务消息是柔性分布式事务,通知型
缺点:
优化:引入本地事务消息表,可解决发送端的原子性问题。将消息插入本地表,定时任务投递mq
补偿方法不一定写,curd,c与d对立,直接由,只需要写u操作,且bas为数据处理层,不涉及业务,可以写通用的(如果标注了补偿方法,就走个性的补偿方法,没有标注的就走通用的补偿方法)
seata-AT模式也是saga的一种实现:自动补偿:
写操作前,生成前置镜像
写操作
写操作前,生成后置镜像;如果补偿,对比前后镜像,进行补偿
tcc也有开源方案,但是实现成本太大,不推荐使用,如seata tcc模式,bytetcc
service comb
是华为的一套微服务解决方案,不是独立的模块,如果使用需要使用全套的微服务解决方案。使用的是saga aop实现
seata
是阿里的产品,支持AT、saga、tcc、xa模式,语言上支持java支持go;而且支持全局锁,解决事务隔离的问题
seata的清铭(肖宇)为了制定标准,给saga对着干
Hmily
是个人产品