TCC扣减库存分析

314 阅读1分钟

TCC扣减库存流程

image.png

  • 首先开启事务,注册全局事务。
  • 双写接口逻辑,注册分支事务。
  • 进行try预留资源,对sku冻结库存。
  • 向seata server上报try成功/失败,进行commit/cancel。
  • commit对sku增加售卖库存。cancel对sku恢复可用库存。

image.png

异常控制

空回滚
cancel比try先执行。由于try阶段可能因为网络异常,始终未执行,但分布式事务要到终态,因此cancel会执行,导致空回滚。
解决方案:对try进行记录。如果cancel时发现有try记录,进行回滚。没有记录,则是空回滚。
空悬挂
空回滚可能会产生空悬挂。后续可能网络恢复,try阶段又成功了,导致预留资源没有使用了,产生了空悬挂。
解决方案:对commit/cancel 记录。当进行try前判断是否commit/cancel过。如果存在记录,则不在进行try预留资源。

为什么要双写

并发在高并发的情况下,多个用户同时购买同一件商品可能会导致并发操作问题。如果只在一个地方扣减库存(例如只在 Redis 中),可能会出现超卖的情况,即库存数量被错误地扣减为负数。通过在两个地方(例如 Redis 和 MySQL)都进行库存扣减,可以避免这种问题。
数据可靠性 如果只在 Redis 中扣减库存,那么在数据丢失后无法恢复。通过将库存扣减操作同时写入到持久化存储(如 MySQL)中,可以确保数据的可靠性。