改进如下:(全程不 FOR UPDATE)
用户抢到红包的时候,根据 pay_status 来决定 is_into_account 的值;
同步回调到app端时,调用接口把支付状态 pay_status 变为2;
异步回调到服务端时,则把支付状态 pay_status 变为1,并把红包id(red_packet主键)放入MQ;
后台自动脚本,从MQ拿到红包id之后,把该红包 is_into_account=0 的记录进行处理,然后再延迟5秒把红包id再次写入MQ,进行二次处理,确保数据全部到账。
五、红包过期退还
这里就一个自动脚本,根据 red_packet 表的 pay_time 判断是否超过24小时且没领完的钱,退回用户余额。







