分布式事务
2025-10-27 16:53:49 0 举报
分布式事务
作者其他创作
大纲/内容
转账后A:0B:200
响应
1.新增采购单
2. 加载数据到内存
9. 消费回执源端
结算库
订单服务
完成数据A:0B:200
事务提交后突然断电
库存服务
Try 用户账户DB扣款
产品表
5. 库存响应后,做其他逻辑
新增支付记录
2.投递异步消息
最终数据存储载体数据真正存储的地方,平常说的刷盘、落盘、查询检索都是针对这里持久化的数据
3. 消息消费
缓存 Redis
undo log file
档案服务
订单库
原始数据A:100B:100
库存 Storage
3. 记录转账前数据用于任务异常时回滚
主键产品名称产品类别... ... ...
库存数据库
Try 冻结商品库存
保存热点数据
业务数据库A
1. 什么是一致性?
回滚日志文件记录事务开始前的回滚命令● 若事务执行了 INSERT,则通过 undo log 执行 DELETE 删除新增数据● 若事务执行了 UPDATE,则通过 undo log 将数据恢复为修改前的旧值
2. 继续,消息发送改为延时消息10s,先发消息,再新增采购单、其他逻辑
提交事务持久化日志
数据文件
4. 投递消息
事务开始,加载数据到内存
6.2 异常情况(事务开始后突然断电)
成功
Try 1. RPC请求用户扣款 2. 保存DB订单创建信息
隔离性(Isolation):一个事务对数据的所有操作,在提交前后,对其他事务的可见程度
redo log buffer
下单可能发生的异常
4:新增支付记录
资源管理器,Resource Manager
消息队列 Rocket
事务开始加载数据到内存
XA模式
下单
一、锁定库存
查超过5min的库存
分布式事务:解决分布式环境数据一致性问题的整套技术方案
采购服务
业务数据库B
3.请求库存服务,扣减库存
异常点
异常描述
异常影响
持久化失败/mq挂了/网络不通
采购单产生了,库存未增加
消费端ACK时mq挂了/网络断了
4.增加库存
sql报错/数据库挂了/网络不通
各种报错:报错/挂了/不通
采购单产生了,库存增加了,后续相应逻辑没有处理
6.2 回滚数据回退到转账前
RPC
结算服务
2:新增订单
新增订单
7. 业务数据入库
锁定库存
2. 新增订单、新增缓存、其他逻辑,本地事务控制
1. 事务进行中,用户主动回滚2. redo log file 恢复到 buffer pool 中存在部分不需要恢复的数据(因 redo log buffer 满了,记录在 redo log file 中),需要结合事务表获知事务未提交,在 buffer pool 中做撤销
4. 定时任务,定期扫锁定5min的库存,查订单服务验证后 决定库存是否释放
redo log buffer 存在的意义
db/api/...
中级护理
采购库
TM
内存
5.1 记录转账后的数据磁盘文件,持久化
RM
三、释放库存
患者端小程序
redo log file
发起认证
采购
订单表:新增成功结算表:新增成功
5. 举一个”栗子“
事务进行中突然断电
业务 Business
回滚事务执行撤销操作
进件
4.扣减库存
1. buffer pool 已清空2. 事务没有提交,整体临时数据无需恢复
SAGA模式
2. 查询未完成的消息
投递异步消息
4. 记录转账后的数据内存缓冲区,未持久化
3:请求支付接口
空实现
转账前A:100B:100
持久性(Durability):事务一旦提交,其修改的数据库数据将永久保存,即使后续发生数据库宕机、断电等故障, 提交的数据也不会丢失
2.新增订单缓存
服务端
库存库
4. 哪些场景会产生分布式数据一致性问题
业务服务B
1.新增订单
异步刷脏页持久化数据
通过重试释放库存,保障两边结果一致
Cancel 释放商品库存
一致性(Consistency):事务执行前后,无论成功还是失败,数据的各项约束(如主键唯一、外键关联、业务规则 等)不会改变,数据从一个合法状态转换到另一个合法状态
1. 事务开始
5.2 记录事务提交
buffer Pool
原子性(Atomicity):不可拆分的最小单位,里面的所有操作,要么全部成功提交,要么全部失败回滚
3. 库存服务消费逻辑:请求采购服务,验证采购单是否存在以及状态,如果正常通过那么进行增加库存操作,反之消息丢弃
事务进行修改数据,生成日志
事务的记录表记录每个事务的信息、状态等
Confirm
8. 消费回执Broker
定时任务 Xxl-job
用户账户 Account
事务表
redis挂了/网络不通
订单库有数据,缓存无数据
3.请求库存服务
服务挂了/网络不通
订单产生了,库存未扣减
订单产生了,库存扣减了,后续相应逻辑没有处理
10. 修改消息状态:已完成
数据库
3. 返回数据
1:下单
高级护理
2. 什么是事务?
编程艺术的解决方案
运营后台
订单表
3. 请求库存服务,扣减库存
1. buffer pool 已清空2. 事务已经提交,但未来得及落盘(buffer pool -> 数据文件)3. 通过 redo log file 恢复转账后的数据到 buffer pool4. 通过异步线程,持久化到磁盘
事务:一个数据库中,包含多个 DML 操作,这些操作要么全部执行,要么全部不执行
完整逻辑是否完成,决定库存是否释放
重做日志文件记录事务开始后做了哪些事情(持久存储的地方)
事务管理器,Transaction Manager
我们看到的样子:理想情况
审批流转
6.1 记录事务回滚
3. 什么是分布式事务?
还原用户账户DB扣款
跨服务
5. 监听消息
Confirm
订单 Order
异步刷脏页,持久化数据
实际的样子:异常情况
1. 消息发送打开消息确认机制,根据ACK回执保证生产端100%发送到Broker
锁库存成功
提交事务,持久化日志
1. 业务数据 + 消息数据 同时写入本地事务保障
采购可能发生的异常
二、新增订单
Cancel
本地消息表
磁盘
Confirm 实扣减DB商品库存
保存订单失败,触发SAGA事务补偿,做锁定库存反向操作
6. 处理业务,实现幂等
undo log file 存在的意义
数据临时操作区,脏页数据的任何操作,临时存储的地方
@GlobalTransactional1. RPC请求扣减库存2. RPC请求创建订单
Cancel
发起审批
审批服务
TCC
跨数据库
7. 异步持久化真正把数据记录到磁盘(结合事务表)
跨数据源
1. 库存服务提供锁定接口,先请求库存服务,锁定库存
数据库 MySQL
1. 极大程度提高性能,避免频繁磁盘 IO
审批结果通知
完整逻辑是否完成,决定库存是否增加
投递延时消息
汇付
6.1 正常情况
重做日志缓冲区记录事务开始后做了哪些事情(临时存储的地方)
6. 数据库,本地事务
主键订单类型产品名称... ... ...
分布式事务:多个数据库中,包含多个 DML 操作,这些操作要么全部执行,要么全部不执行
事务进行,修改数据,生成日志
失败
业务服务A
0 条评论
下一页