当前位置:网站首页>敲黑板画重点:七种常见“分布式事务”详解
敲黑板画重点:七种常见“分布式事务”详解
2022-07-26 11:57:00 【InfoQ】
一、2PC:
1、第一阶段:准备阶段

- ① 协调者向所有参与者发送事务内容,询问是否可以提交事务,并等待答复
- ② 各参与者执行本地事务操作,将 undo 和 redo 信息记入事务日志中(但不提交事务)
- ③ 如参与者执行成功,给协调者反馈同意,否则反馈中止,表示事务不可以执行
2、第二阶段:提交阶段
- ① 协调者节点向所有参与者节点发出正式提交的 commit 请求。
- ② 收到协调者的 commit 请求后,参与者正式执行事务提交操作,并释放在整个事务期间内占用的资源。
- ③ 参与者完成事务提交后,向协调者节点发送ACK消息。
- ④ 协调者节点收到所有参与者节点反馈的ACK消息后,完成事务。

- ① 协调者向所有参与者发出 rollback 回滚操作的请求
- ② 参与者利用阶段一写入的undo信息执行回滚,并释放在整个事务期间内占用的资源
- ③ 参与者在完成事务回滚之后,向协调者发送回滚完成的ACK消息
- ④ 协调者收到所有参与者反馈的ACK消息后,取消事务

3、2PC的缺点:
二、3PC:

1、阶段一:CanCommit 准备阶段
2、阶段二:PreCommit 阶段


3、阶段三:doCommit阶段


4、3PC的优缺点:
三、TCC
1、什么是TCC:
2、TCC的执行流程:
- Confirm:执行真正的业务(执行业务,释放锁)
- Cancle:是对Try阶段预留资源的释放(出问题,释放锁)

3、TCC如何保证最终一致性:
4、TCC的注意事项:


5、TCC方案的优缺点:
四、Saga事务:
1、什么是Saga事务:
2、Saga的恢复策略:


3、Saga事务的实现方式:
- 命令协调(Order Orchestrator)
- 事件编排(Event Choreographyo)


- ① 事务发起方的主业务逻辑发布开始订单事件。
- ② 库存服务监听开始订单事件,扣减库存,并发布库存已扣减事件。
- ③ 订单服务监听库存已扣减事件,创建订单,并发布订单已创建事件。
- ④ 支付服务监听订单已创建事件,进行支付,并发布订单已支付事件。
- ⑤ 主业务逻辑监听订单已支付事件并处理。
4、Saga事务的优缺点:
五、本地消息表
1、什么是本地消息表:
- 业务处理成功、事务消息发送失败
- 业务处理失败、事务消息发送成功
2、本地消息表的执行流程:

- ① 事务主动方在同一个本地事务中处理业务和写消息表操作
- ② 事务主动方通过消息中间件,通知事务被动方处理事务消息。消息中间件可以基于 Kafka、RocketMQ 消息队列,事务主动方主动写消息到消息队列,事务消费方消费并处理消息队列中的消息。
- ③ 事务被动方通过消息中间件,通知事务主动方事务已处理的消息。
- ④ 事务主动方接收中间件的消息,更新消息表的状态为已处理。
- 当①处理出错,由于还在事务主动方的本地事务中,直接回滚即可
- 当②、③处理出错,由于事务主动方本地保存了消息,只需要轮询消息重新通过消息中间件发送,通知事务被动方重新读取消息处理业务即可。
3、本地消息表的优缺点:
六、MQ事务消息
1、MQ事务消息的执行流程:

2、RocketMQ事务消息:

- 步骤①:发送方向 MQ Server(MQ服务方)发送 half 消息
- 步骤②:MQ Server 将消息持久化成功之后,向发送方 ack 确认消息已经发送成功
- 步骤③:发送方开始执行本地事务逻辑
- 步骤④:发送方根据本地事务执行结果向 MQ Server 提交二次确认(commit 或是 rollback)。
- 步骤⑤:MQ Server 对该消息发起消息回查
- 步骤⑥:发送方收到消息回查后,需要检查对应消息的本地事务执行的最终结果
- 步骤⑦:发送方根据检查得到的本地事务的最终状态再次提交二次确认。
3、MQ事务消息的优缺点:
- 消息数据独立存储 ,降低业务系统与消息系统之间的耦合
- 吞吐量大于使用本地消息表方案
- 一次消息发送需要两次网络请求(half 消息 + commit/rollback 消息) 。
- 业务处理服务需要实现消息状态回查接口。
七、最大努力通知

八、各方案常见使用场景总结
- 2PC/3PC:依赖于数据库,能够很好的提供强一致性和强事务性,但延迟比较高,比较适合传统的单体应用,在同一个方法中存在跨库操作的情况,不适合高并发和高性能要求的场景。
- TCC:适用于执行时间确定且较短,实时性要求高,对数据一致性要求高,比如互联网金融企业最核心的三个服务:交易、支付、账务。
- 本地消息表/MQ 事务:适用于事务中参与方支持操作幂等,对一致性要求不高,业务上能容忍数据不一致到一个人工检查周期,事务涉及的参与方、参与环节较少,业务上有对账/校验系统兜底。
- Saga 事务:由于 Saga 事务不能保证隔离性,需要在业务层控制并发,适合于业务场景事务并发操作同一资源较少的情况。Saga 由于缺少预提交动作,导致补偿动作的实现比较麻烦,例如业务是发送短信,补偿动作则得再发送一次短信说明撤销,用户体验比较差。所以,Saga 事务较适用于补偿动作容易处理的场景
边栏推荐
- [Anhui University] information sharing of postgraduate entrance examination and re examination
- DS-112时间继电器
- JVM内存溢出和内存泄漏的区别
- 3.2 create menu and game pages (Part 2)
- Real time synchronization and conversion of massive data based on Flink CDC
- 尤雨溪向初学者推荐Vite 【为什么使用Vite】
- 代码实例详解【可重入锁】和【不可重入锁】区别?
- 4.1 configure MySQL and register login module
- Miccai2022 paper | evolutionary multi-objective architecture search framework: application in covid-19 3D CT classification
- 征婚故事
猜你喜欢

专访即构科技李凯:音视频的有趣、行业前沿一直吸引着我

Real time synchronization and conversion of massive data based on Flink CDC

FPGA入门学习(二) - 二选一的选择器

RFID的工作原理

Understanding useref is enough

PyCharm是真的强

Live broadcast preview at 19:30 on July 27: harmonyos3 and Huawei's full scene new product launch

Introduction to FPGA (I) - the first FPGA project

空洞卷积详解(输入输出大小分析)

4.1 configure MySQL and register login module
随机推荐
PyCharm是真的强
y9000p2022重装win10问题
el-form 每行显示两列,底部按钮居中
Ubenwa, a start-up under Mila, received an investment of US $2.5 million to study the AI diagnosis of infant health
【附下载】一款强大的Web自动化漏洞扫描工具——Xray
向日葵资深产品总监技术分享:如何在AD域环境下应用
SSJ-21B时间继电器
面试官:如何理解QPS,TPS,RT?
System call capture and analysis - ring layer kprobe hijacks system calls
MILA旗下初创企业Ubenwa获得250万美元投资,研究婴儿健康AI诊断
大佬们,cdc oracle 怎么设置从指定scn号开始读取,或是怎么设置只读全量的归档,不去读取快
什么是OOM,为什么会OOM及一些解决方法
Harbor2.2 quick check of user role permissions
Flink's real-time data analysis practice in iFLYTEK AI marketing business
Flink cdc 是不是只支持 sql-client的方式提交SQL脚本啊
Understanding useref is enough
Redis实现Single单点登入--系统框架搭建(一)
音视频+
按位与怎么写SQL
Li Kai: the interesting and cutting-edge audio and video industry has always attracted me