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

这是我的操作逻辑;

我在判断还有剩余红包后(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
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 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年前 评论

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