模拟微信领红包操作,并发性如何处理?

这是我的操作逻辑;

我在判断还有剩余红包后(cache_remain_size>0),马上进行了cache_remain_size--;操作,
会出现以下问题:
A用户获取cache_remain_size = 1,之后进行cache_remain_size--;cache_remain_size就变为0;
B用户获取cache_remain_size = 0,就不可领去红包。但是如果A用户之后领取红包失败,cache_remain_size++;cache_remain_size又变为1,说明红包还有剩余。。。这个就有些矛盾了。如何解决?

附言 1  ·  6年前

如果按这个流程的话只有在数库操作环节不出错的情况下才运行良好

franktrue
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6

直接把100元随机分为8个值,存入数组。
然后每次执行获取rand(0, count($array)-1)的下标,读取红包金额->写入数据库日志->销毁此下标元素->保存新的数组->红包领取成功。

6年前 评论
franktrue

@JayKing 但是这样还是会产生我说那个问题。在每次rand(0, count($array)-1)到红包数值的之后还要进行数据库操作等,记录数据的功能,还是会出现上面说的A、B执行时的问题

6年前 评论
leo

select for update

6年前 评论
franktrue

@leo 啥意思。。。

6年前 评论
franktrue

@waney 哦哦,我看一下,thx

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!