业务场景:用户下单,订单服务创建订单 + 库存服务扣减库存,两个微服务,要保证两者同时成功 / 同时失败
1. Seata AT 模式(无侵入,自动 undo 日志)
适合:普通业务下单,非高风险资金场景
执行流程
- 全局事务开启,生成 XID,传递到订单、库存两个服务
- 一阶段
- 订单服务:
insert 订单,记录修改前 / 后数据快照到 undo_log 表 - 库存服务:
update stock set count=count-1,同样写入 undo_log 快照 - 两个分支提交本地数据库事务,释放本地锁,undo 日志持久保存
- 订单服务:
- 二阶段 - 提交:全局事务成功,订单、库存服务删除各自 undo_log 记录,流程结束
- 二阶段 - 回滚:如果库存扣减异常,Seata 读取 undo_log 里的快照,自动执行 SQL 把数据恢复到修改前
✅优点:业务代码几乎不用改,只需要加@GlobalTransactional注解
❌风险点: 极端情况:一阶段提交成功,undo_log 落库后,
保存 undo_log 的数据库宕机,undo 日志丢了,二阶段无法回滚。订单创建成功,但库存扣减无法回滚,出现数据不一致。
所以资金、核心库存场景不推荐只使用 AT。
@GlobalTransactional
public void createOrder(Long goodsId, Integer num){
orderService.insertOrder(goodsId,num);
stockService.deductStock(goodsId,num);
}
2.TCC 模式(Try-Confirm-Cancel,业务层手动编码)
适合:高可靠场景,支付、核心库存扣减(视频推荐的资金场景首选)
TCC 是业务层面预留资源,不是数据库锁


3. 可靠消息最终一致性(本地消息表 / RocketMQ 事务消息)
适合:异步场景,订单创建成功后,发消息扣库存、发积分、发通知
⚠️不适合强实时库存扣减,适合异步通知类场景


浙公网安备 33010602011771号