一、分布式事务解决方案
2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit phase),2是指两个阶段,P是指准备阶段,C是指提交阶段。
-
准备阶段(Prepare phase)
-
提交阶段(commit phase)
举例:张三和李四好久不见,老友约起聚餐,饭店老板要求先买单,才能出票。这时张三和李四分别抱怨近况不如意,囊中羞涩,都不愿意请客,这时只能AA。只有张三和李四都付款,老板才能出票安排就餐。但由于张三和李四都是铁公鸡,形成了尴尬的一幕:
准备阶段:老板要求张三付款,张三付款。老板要求李四付款,李四付款。
提交阶段:老板出票,两人拿票纷纷落座就餐。
例子中形成了一个事务,若张三或李四其中一人拒绝付款,或钱不够,店老板都不会给出票,并且会把已收款退回。
- 准备阶段(Prepare phase):事务管理器给每个事务参与者发送prepare消息,每个事务参与者在本地执行事务,并写本地的Undo/Redo日志,此时事务是没有提交的;
-
(Undo日志是记录修改前的数据,用于数据库回滚,Redo日志是记录修改后的数据,用于提交事务后写入数据文件)
-
提交阶段(Commit pahse):如果事务管理器收到了所有参与者的执行失败或者是超时消息,直接给每一个事务参与者发送回滚(rollback)消息;否则,发送(commit)消息,事务参与者根据事务管理器的指令执行提交或者回滚事务,并释放资源。
具体步骤如下:
成功:
失败:
二、Seata 简介
官网: Apache Seata
概念: Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
在我们的微服务系统中,对应业务被对应的拆分成独立模块,在官方提供的架构图中,我们可以看出当前是三个服务:
- 仓储服务:对给定的商品进行增删操作记录数量
- 订单服务:根据采购者的需求创建订单
- 账户服务:从用户账户中扣除余额、积分等
在这套架构中,用户下单购买商品的业务,就需要三个服务来完成,每个服务内部的数据一致性由本地事务来保证,但是全局的数据一致性问题就没办法保证,Seata就是来进行解决这种问题的解决方案。
2.1Seata 术语
要了解Seata,首先我们要了解一下Seata的几个关键的概念:
- TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,驱动全局事务的提交或者回滚;
- TM(Transation Manager)事务管理者(事务发起者),定义全局事务的范围:开始全局事务、提交或回滚全局事务;
- RM(Resource Manager)-资源管理器,就是每一个参与事务的微服务,负责分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务回滚或者提交。