Seata解决分布式的四种方案
前言:
Seata是一款开源的分布式事务解决方案,提供高性能和简单易用的服务,确保微服务架构下的数据一致性, 本文章将依照本人的实际研究所得展开讲述,若有差错,敬请批评,还望海涵~
一、什么是分布式事务?
在分布式项目中,因为服务的拆分,每个服务单独管理自己的数据库。而一个业务操作往往涉及多个服务的数据落库,所以会出现某个服务出现业务异常而出现数据不一致的问题,为了避免数据库的数据不一致问题,分布式服务提供了全局事务,每个微服务作为分支事务,正是因为有全局事务的存在就可以保证了所有的分支事务能够同时成功或同时失败,能正确的进行数据的落库或回滚。
二、Seata解决分布式的四种方案
AT
第一阶段,在AT模式中TC(事务协调者)为包含在其中的多个RM(资源管理者)注册全局事务,然后调用分支事务注册到TC中,接着RM执行sql并提交到undo log(数据快照)中,数据此时处于一种中间状态(软状态),其中包含了事务执行前的旧数据,和事务执行之后的新数据,为保证数据一致性提供了保障。接着RM报告TC事务的执行状态。
第二阶段,TC判断事务是否全部执行成功,并对RM进行对应的提交事务或者回滚事务的通知。最后由TM(应用程序)提交或者回滚全局事务,TC再次进行检查分支事务的状态。
优点:AT模式以分二阶段提交事务,弥补了XA模型资源占用周期过长的缺陷,性能也得到了进一步的加强。
缺点:舍弃了XA的资源占用的同时,也不能保证事务的强一致性,会出现数据在转化过程中提前被用户访问的情况,导致用户得到的是旧数据。
Seata的AT模式的执行流程
XA :
XA模式主要特点为两阶段事务提交,
第一阶段,TC(事务协调者)会通知每个分支事务RM(每个微服务)做好执行事务的准备工作,RM返回就绪信息。在此阶段事务执行但不提交,但是持有数据库锁,占用了数据库的连接。
第二阶段,TC(事务的协调者)会根据第一阶段的执行报告来进行下一步判断,若所有分支事务都能执行成功,那就提交事务,数据落库,否则回滚事务。
优点:1、保证了数据的强一致性,满足ACID原则
2、支持常用的数据库,实现简单,没有代码侵入
应用场景:银行业务、金融行业
缺点:1、若事务因为第一阶段分支事务的失败而长时间等待则会导致资源长时间不得释放,业务无法快速实现响应的问题。
2、依赖关系型数据库实现
TCC
TCC模式的核心思想是通过三个阶段来确保分布式事务的一致性:
在Try阶段中系统会检查业务是否可以执行,并操作对资源进行预留,但依旧没有真正操作和使用资源。
在Confirm阶段,预留资源在此阶段会真正的使用
在Cancel阶段,释放掉锁定的资源
优点:TCC模式对资源的锁定预留保证了强一致性
缺点:TCC模式需要额外的网络通信和预留的预留,导致性能开销大。
SAGA
Saga模式是一种分布式事务处理模式,它将一个大的事务分解为多个小的事务(子事务),每个子事务都是独立的本地事务,可以独立提交或回滚。如果在执行过程中某个子事务失败,Saga模式会触发补偿事务(Compensation Transaction)来撤销之前已经提交的子事务的影响,从而保持数据的一致性。
来源:juejin.cn/post/7424901256151728166