基于分布式锁和分布式事务的秒杀抢购方案

  • Post author:
  • Post category:其他

1.redisson方案
正常情况:秒杀订单表验证可抢购数量 ->验证成功 -> 先扣减库存- >redis扣减成功 ->插入订单表 ->插入成功 ->预支付状态 30分钟内 ->支付成功 ->修改订单状态为已支付 ->完成

失败的情况:redis扣减成功 插入订单表 ->插入失败 ->插入库存流水表 ->10分钟后延迟进行redis库存补偿(防止多补库存)
订单未支付 ->定时器30分钟后开启 订单效验 -> 补偿redis库存
redis承载了高并发 实现扣减库存的原子性
这就是Saga模式 它是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。

2.seata分布式事务
正常情况:秒杀订单表验证可抢购数量->验证成功->mysql数据库扣减库存->mysql数据库扣减成功->插入订单表->插入成功->预支付状态 30分钟内->支付成功->修改订单状态为已支付->完成

失败的情况数据库扣减成功->插入订单表->插入失败 seata的两阶段提交事务回滚->回滚失败->人工回滚

这里介绍一下seata的事务管理
在这里插入图片描述
TC 事务协调器 事务注册中心 维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
TM 全局事务决策 控制事务的边界 负责开启一个全局事务 并最终发起全局事务提交或者回滚
RM 分支事务决策 控制分支事务 负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
seata执行流程:
依靠seata的事务管理器实现
AT模式 两阶段提交
在这里插入图片描述

一阶段提交 TM向TC申请全局事务,后开启全局事务 得到全局事务XID 在上下文中传播 RM向TC注册分支事务后执行 申请该条记录的全局锁 回写事务执行结果
在这里插入图片描述

二阶段 TM根据此次XID 查看所有分支事务是否正常执行成功
执行成功后 释放全局锁 直接提交 删除undolog日志 如果失败 尝试申请全局锁 执行全局回滚 进行数据效验 进行异步线程 后台回滚

TCC模式 支持将自定义事务纳入TC事务管理器


版权声明:本文为dshakjhfvf原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。