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

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事务管理器

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值