0
点赞
收藏
分享

微信扫一扫

幂等性技术

蓝哆啦呀 2022-02-16 阅读 57
分布式

使用场景

购物下单生成订单

支付扣款

库存扣减

物流发货

解决方案

前端

前端防重

  • RPG模式 :Post Direct Get 重定向到另外一个页面,防止刷新
  • Token机制:
  1. 对业务代码执行和删除token整体加线程锁,其它线程排队阻塞 
  2. 借助单线程redis incr 第一次获取token并incr返回1,如果第二次incr后返回2就是合法请求,如果为其它值,就为非法请求直接返回。  
  3. 最优解  校验删除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 释放锁

举报

相关推荐

0 条评论