秒杀场景发放优惠券,如果券已经发出去了,但是数据库写失败了,会发生什么,怎么避免?

提问者:帅平 问题分类:面试刷题
秒杀场景发放优惠券,如果券已经发出去了,但是数据库写失败了,会发生什么,怎么避免?
2 个回答
沐叶清风
沐叶清风
如何避免的解决方案是:宁可发券慢点,也不能让数据错,具体的实施方案如下:
1、先写数据库再操作redis
数据库事务成功后,再操作Redis扣库存。即使Redis操作失败,至少数据库有完整记录,后续可补偿
2、消息队列兜底
即使用消息队列做“二次确认”,及时第一次写库失败,靠MQ重试能保证最终写入成功。
3、对账脚本救场
1、每天凌晨跑个脚本,发现不一致就自动修复,相当于给系统上个保险
2、对多发出的券,给用户发短信道歉并赠送等额优惠
3、增加库存校验熔断机制:当Redis与数据库库存差异超过5%时自动停止发券
发布于:3天前 IP属地:
曾经多难忘
曾经多难忘
可能造成的问题:
1、用户看到"领取成功",实际券没存到数据库 → 用户以为有券但用不了,投诉量爆炸。
2、可能出现超发:假设库存1000,Redis扣减到800但数据库没存,后续用户继续领券,最终发券量超过库存
3、Redis和数据库数据永久不一致 → 财务对账发现钱对不上,程序员背锅
发布于:3天前 IP属地:
我来回答