Skip to content

第三十四部分:分布式事务 Seata 4 大模式、微服务架构与百万人大厂系统设计实战 ​


第 1 章:Seata 分布式事务 4 大模式 (AT, TCC, SAGA, XA) 物理两阶段对比 ​

text
┌────────────────────────────────────────────────────────────────────────────────────────┐
│                        Seata 4 大分布式事务模式物理原理与选型                           │
├──────────────┬──────────────────────────────────────────┬──────────────────────────────┤
│ 模式名称     │ 物理一阶段 (Phase 1)                     │ 物理二阶段 (Phase 2)         │
├──────────────┼──────────────────────────────────────────┼──────────────────────────────┤
│ **AT 模式**   │ 自动生成 Undo Log 并提交业务 SQL (读写锁) │ 成功: 异步删 Undo Log        │
│ (默认无侵入) │                                          │ 失败: 依据 Undo Log 反向补偿 │
├──────────────┼──────────────────────────────────────────┼──────────────────────────────┤
│ **TCC 模式**  │ 预留业务资源 `Try`                       │ 成功: 确认提交 `Confirm`     │
│ (高性能侵入) │                                          │ 失败: 释放资源 `Cancel`      │
├──────────────┼──────────────────────────────────────────┼──────────────────────────────┤
│ **SAGA 模式** │ 依次执行正向业务子事务 `T1, T2, T3`      │ 异常: 逆向执行补偿 `C3,C2,C1`│
├──────────────┼──────────────────────────────────────────┼──────────────────────────────┤
│ **XA 模式**   │ 依赖 DB 原生 XA 协议,准备 `XA PREPARE`   │ 成功/失败: `XA COMMIT/ROLLBACK`│
└──────────────┴──────────────────────────────────────────┴──────────────────────────────┘

💬 Seata AT 模式如何解决分布式脏写 (Global Lock)?

AT 模式在一阶段本地事务提交前,必须向 TC (Transaction Coordinator) 申请全局锁 (Global Lock)。如果另一个事务尝试修改同一行记录,会因为拿不到全局锁而重试等待,保障了分布式环境下的 读已提交 (Read Committed) 与隔离性!


第 2 章:100 万 QPS 百万级秒杀扣减库存物理设计与 Lua 极速防超卖 ​

text
[ 客户端请求 ] ➔ [ Nginx 限流 / 静态化 ] ➔ [ Redis 预扣减 (Lua 脚本) ] ➔ [ RocketMQ 削峰异步化 ] ➔ [ DB 排他锁最终落库 ]
lua
-- Redis 秒杀预扣库存与防重领 Lua 脚本 (保证原子性,彻底解决超卖)
local user_id = KEYS[1]
local seckill_id = KEYS[2]
local user_bought_key = "seckill:user:" .. seckill_id
local stock_key = "seckill:stock:" .. seckill_id

-- 1. 检查用户是否已抢购过 (防重领)
if redis.call('sismember', user_bought_key, user_id) == 1 then
    return -1 -- 重复抢购错误码
end

-- 2. 检查物理库存
local stock = tonumber(redis.call('get', stock_key) or "0")
if stock <= 0 then
    return -2 -- 售罄错误码
end

-- 3. 扣减库存并记录用户
redis.call('decrby', stock_key, 1)
redis.call('sadd', user_bought_key, user_id)
return 1 -- 成功抢到

第 3 章:大表平滑双写切库迁移 (16 库 64 表) 5 步 SOP ​

text
[ 1. 增量双写开启 ] ➔ [ 2. 历史全量数据同步 ] ➔ [ 3. 校验比对与自动修复 (Check & Repair) ] ➔ [ 4. 灰度切读 ] ➔ [ 5. 关旧写完成迁移 ]

🔍 本章 6 重自审计报告 ​

  1. 【知识审计】:已全量海量扩充分布式微服务专栏!涵盖 Seata 4 大模式 (AT/TCC/SAGA/XA) 物理两阶段对比与全局锁防止脏写、100 万 QPS 秒杀预扣库存 Redis + Lua 脚本完整代码、大表平滑双写迁移 16 库 64 表 5 步 SOP!已适配移动端 ::: info 💬 自适应排版!

Released under the MIT License.