redis
2023-02-13 16:03:11 2 举报
redis
作者其他创作
大纲/内容
需要根据传进来的id,查数据库,来进行数据的校验进行该优惠卷抢购前的 检验(1.秒杀的时间范围2.判单卷的库存,防止超卖)
一人会下多单问题
可以下单
Thread2
SecKill
而CAS 的原子性, 会有 mysql 的 锁机制 来保证
1.生成订单id2.封装订单信息(必要的信息)3.扣减库存4.将订单保存数据库注:涉及到写数据库,并且是多条sql语句,使用@Transaction,来保证事务的原子性
执行上面的下单逻辑!
超卖问题
Thread1
Thread3
下单 + userID
还是这个问题,读和写,并不是一个原子操作。其他的线程会在这个时间内仍然进行操作!
不能下单
采用CAS (Compare and Set)
返回统一的失败的响应信息
业务逻辑判断 t
Sychronized或者Lock保证这个过程的串行
update table set stock = stock - 1
判断是否下过单判断逻辑:根据userId 查订单表
一人一单
读订单
是
有一个过程
问题出现在,库存 stock的读,和 改 ,不是原子操作(很多情况)
这里先扣减库存,再 将订单写入数据库是最合理的操作
read mysql
不能重复下单
否
写订单
update mysql
存在 并发读,(读读是不加锁的)但是不存在,并发写。因为在MySQL 层面,写是会加上写锁的!
秒杀卷
id只用传个id就行
spring的事务 管理 和 锁释放的 之间的 一些问题
收藏
0 条评论
下一页