当前位置:网站首页>敲黑板画重点:七种常见“分布式事务”详解
敲黑板画重点:七种常见“分布式事务”详解
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 事务较适用于补偿动作容易处理的场景
边栏推荐
- Harbor2.2 quick check of user role permissions
- V01 - XX,记录美好生活从日志开始
- The latest heart-shaped puzzle applet source code + with flow master
- 大佬们,cdc oracle 怎么设置从指定scn号开始读取,或是怎么设置只读全量的归档,不去读取快
- [countdown 10 days] Tencent cloud audio and video special is about to meet, and the thousand yuan prize is waiting for you!
- 虚拟偶像代言产品出问题谁负责? 且听律师分析
- Dry goods semantic web, Web3.0, Web3, metauniverse, these concepts are still confused? (medium)
- 空洞卷积详解(输入输出大小分析)
- Pytoch deep learning quick start tutorial -- mound tutorial notes (I)
- 大佬们,请教一下,我按照文档配了cdc连接oracle,总是运行报错找不到类 ValidstionE
猜你喜欢

V00 - 年纪大了,想做啥就做啥吧

CVPR 2022 new SOTA for monocular depth estimation new CRFs: neural window fullyconnected CRFs

线上一个隐匿 Bug 的复盘

JVM内存溢出和内存泄漏的区别

浅谈低代码技术在物流运输平台中的搭建与管理

Yuancosmos daily | yuancosmos social app "Party Island" product off the shelves; Guangzhou Nansha yuanuniverse industrial agglomeration zone was unveiled; The inter ministerial joint conference system

【活动早知道】LiveVideoStack近期活动一览

How RFID works

System call capture and analysis conclusion making system call log collection system

Codepoint 58880 not found in font, aborting. Flutter build APK reports an error
随机推荐
请问下有人知道FlinkSQL 的 Retrack 在哪里可以指定吗? 网上资料只看到API 代码设
What is per title encoding?
Pytest interface automated testing framework | common plug-ins of pytest
Question and answer No. 48: geek appointment - construction path of observable system
Fineos announced the open registration of grouptech connect activities in 2022
flink 写redis 比较慢,大家有啥思路优化吗?
Codepoint 58880 not found in font, aborting. Flutter build APK reports an error
向日葵资深产品总监技术分享:如何在AD域环境下应用
面试官:如何理解QPS,TPS,RT?
开放原子开源基金会OpenHarmony工作委员会主席侯培新寄语OpenAtom OpenHarmony分论坛
什么是OOM,为什么会OOM及一些解决方法
一些常用的文章写作使用方法和技巧
Mongodn database is connected in the form of URL
Network protocol: tcp/ip protocol
Ga-rpn: recommended area network for guiding anchors
[communication principle] Chapter 1 -- Introduction
Pytorch深度学习快速入门教程 -- 土堆教程笔记(二)
Pytoch deep learning quick start tutorial -- mound tutorial notes (II)
pytest接口自动化测试框架 | conftest.py
浅谈低代码技术在物流运输平台中的搭建与管理