Dict.CN 在线词典, 英语学习, 在线翻译 ------------- MyGitee My腾云code My51cto

Happy_EveryDay

可以平凡 不可以平庸 无爱则无忧,无欲则无求,无怒而无敌,无怨才是佛。所有烦恼,都是放不下的执著 开源技群 328035181 MyGitee

博客园 首页 新随笔 管理

业务场景:用户下单,订单服务创建订单 + 库存服务扣减库存,两个微服务,要保证两者同时成功 / 同时失败

 

1. Seata AT 模式(无侵入,自动 undo 日志)

适合:普通业务下单,非高风险资金场景

执行流程

  1. 全局事务开启,生成 XID,传递到订单、库存两个服务
  2. 一阶段
    • 订单服务:insert 订单,记录修改前 / 后数据快照到 undo_log 表
    • 库存服务:update stock set count=count-1,同样写入 undo_log 快照
    • 两个分支提交本地数据库事务,释放本地锁,undo 日志持久保存
  3. 二阶段 - 提交:全局事务成功,订单、库存服务删除各自 undo_log 记录,流程结束
  4. 二阶段 - 回滚:如果库存扣减异常,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 是业务层面预留资源,不是数据库锁

image

 

image

 

 

3. 可靠消息最终一致性(本地消息表 / RocketMQ 事务消息)

适合:异步场景,订单创建成功后,发消息扣库存、发积分、发通知

⚠️不适合强实时库存扣减,适合异步通知类场景

image

 

 

 

 

 

image

 

posted on 2026-09-19 01:31  2026cn  阅读(16)  评论(0)    收藏  举报