背景
之前工作中用了很多防并发和幂等,一般也是使用前辈们常用的手段,今天系统梳理下之前用的手段
防并发
1.手段一分布式锁(redis/zk)
2.请求ID作为UK,用DB兜底
3.乐观锁更新争抢
4.悲观锁等待
一锁二判三更新
其实不管 乐观锁,分布式锁,悲观锁 都是根据全局单点锁住了操作对象就是第一步
幂等
其任意多次执行所产生的影响均与一次执行的影响相同
幂等只是在防住并发的场景下,识别目标事件是否已完成预期,如果完成预期直接返回成功不再执行【个人理解】
实际场景
以前做营销发券,一定不能超发
step1:先查,如果记录不存在走step2,如果存在走step3
step2: 先落存根 根据业务设计UK 并发都会被挡住 券A 用户每天只能发一张
step3: 记录存在则验证状态,如果是已完成的(已经成功了,幂等住不处理)
如果是可执行的 通过乐观锁更新状态为执行中,持有锁后继续step4
step4: 执行发券操作,结束后 把执行中的记录改成终态