使用场景
购物下单生成订单
支付扣款
库存扣减
物流发货
解决方案
前端
前端防重
- RPG模式 :Post Direct Get 重定向到另外一个页面,防止刷新
- Token机制:
- 对业务代码执行和删除token整体加线程锁,其它线程排队阻塞
- 借助单线程redis incr 第一次获取token并incr返回1,如果第二次incr后返回2就是合法请求,如果为其它值,就为非法请求直接返回。
- 最优解 校验删除token,第一次token存入redis,第二次执行业务删除token,如果删除成功就执行业务,如果删除失败就是重复请求
代码实现
使用幂等性注解 HandlerInterceptor 删除token失败就是重复执行
- 防重表 增加一张放重表 增加唯一索引 保证并发下只有一条
select + insert 查询是否存在如果存在就insert 无法适用于分库分表适合单表
悲观锁在使用过程中会出现死锁
A访问表A (锁住A)访问表B B访问表B(锁住B) 访问表A
- mysql乐观锁
库存扣减并发是因为多线程,一个线程读到了另外一个线程未提交的数据
syncronized +@Transactional并发后还是会有库存减少 syncronized锁定方法对象 、transactional对当前方法增强,动态代理出来一个对象,syncronized和transactional操作的是两个不同的对象
通过版本号进行控制、添加version字段默认为0 ,更新版本号
基于条件进行控制
zk分布式锁
redis分布式锁
setnx :redis-key-value 只有key不存在才会设置 否则返回0
expire:过期时间
delete:删除key 释放锁
MQ消息缓冲区: MQ接收到Producer发送的消息后,不会立即推送给consumer ,而是积攒到一定的数量后进行消息的发送。