分布式事务

发布时间 2023-09-27 09:58:04作者: JinFangWei

    分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如跨数据源的分布式事务还有跨服务的分布式事务而分布式事务中又有很多个本地事务,在每个本地事务中药保证ACID的原则,而分布式事务呢我们就可以把所有的事务看作是一个业务,也就是全局事务,要保证全局事务的原子性,要么所有本地事务都成功,要么全部失败,这就是分布式事务,而分布式事务满足CAP定理即在分布式系统中不可能同时满足C、A、P,C、A、P是分布式系统三个指标分别代表一致性、可用性和分区容错性,一致性就是用户访问分布式系统中的任意节点,得到的数据必须一致可用性就是用户访问集群中的任意健康节点,必须能得到响应,而不是超时或拒绝而分区容错性就是如果系统因为网络故障或其它原因导致分布式系统中的部分节点与其它节点失去连接,就会形成独立分区来保障系统可用,在分布式系统中,P是一定要保证的,因为网络等一些客观因素是不可避免的此时就要保证分区容错,而在分布式系统中,C和A是矛盾的,不可能同时满足,因为满足P的同时,如果要保证一致性,就必须等待网络恢复,完成数据同步后,整个集群才对外提供服务,服务处于阻塞状态,不可用如果要保证可用性,就不能等待网络恢复那么各个节点之间就会出现数据不一致这就是分布式事务的CAP定理。而因为分布式事务只能满足CP或AP,这时候就会出现一些问题,为了解决这些问题,分布式事务又引入了BASE理论,BASE理论包含三个思想,BA是基本可用,分布式系统在出现故障时,允许损失部分可用性,即保证核心可用S是软状态,在一定时间内,允许出现中间状态,比如临时的不一致状态还有E是最终一致性,虽然分布式事务无法保证强一致性,但是在软状态结束后,可以保证终达到数据一致分布式事务最大的问题就是各个子事务的一致性问题,因此根据CAP定理和BASE理论可以提出一些解决办法,在AP模式下,各个子事务分别执行和提交,允许出现结果不一致,然后采用弥补措施来回复数据,来实现最终一致。而在CP模式下,可以让各个子事务执行后相互等待,同时提交同时回滚,并且在事务相互等待的过程中,让处于等待状态的子事务处于弱可用状态,来达成强一致。但不管是哪一种模式,都需要在子系统事务之间互相通讯,协调事务状态,也就是需要一个事务协调者TC,这里的子事务,称分支事务,所有分支在一起被称为全局事务。基于这种模式的架构方案有很多,其中最火的就是Seata,在Seata的架构下,TC也就是事务协调者,可以维护全局和分支事务的状态,协调全局事务提交或回滚,TM也就是事务管理器,会定义全局事务的范围、开始全局事务并且提交或回滚全局事务,还有RM也就是资源管理器,是用来管理分支事务处理的资源,与TC交谈注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。基于这样的架构呢Seata提供了四种不同的分布式事务解决方案,第一种是XA模式,XA模式是牺牲一定的可用性,来保证强一致性的分阶段事务模式,无业务入侵,第二种是TCC模式,TCC模式是达成最终一致的分阶段事务模式,他是有业务入侵的,第三种是AT模式,AT模式也是达成最终一致的分阶段事务模式,但是他没有业务入侵,AT模式也是Seata的默认模式,第四种就是SAGA模式,SAGA模式是长事务模式,他也有业务入侵。下面就来详细说说AT模式的基本流程,AT模式分为两个阶段,第一阶段,TM,向TC发送指令开启全局事务,然后由TM调用分支,再由资源管理器RM向TC发送指令注册分支事务,注册成功后再去执行sql并提交分支事务,在提交前后会将修改前后的数据储存在undolog数据表中,称为快照,第二阶段,当所有分支事务都提交后,TM会向TC发送指令来提交或回滚全局事务,然后TC会去检查每个提交的分支事务的状态,若无异常就由TM执行提交全局事务,并删除undolog中的数据,若是其中任意一个分支事务出现了问题,则TC会协调TM去回滚全局事务,然后根据存储到undolog中的数据将数据恢复到执行更新前的版本,最后删除undolog中的数,这就是Seata的AT模式。