大家好,我想用云开发做一个类似餐厅排队叫号的微信小程序,让客户自己在手机上点击取号,取餐号是连续并且不重复的。
取号的逻辑,我想的是:首先查询当前排队序号,然后+1,把更新后的排队序号返回给用户,并且存储在数据库;下一位用户读取更新后的序号,继续+1后返回给用户,再存储在数据库...就这样延续下去。
就是说我先进行一次读取操作,然后再+1更新数据。后面的用户在此基础上取号。
我头疼的是,如果几十个人同时在自己手机上点击按钮取号,要怎么防止取餐号给重复呀?
同时取号,多个用户的请求并发,数据库估计来不及走完“读取—更新—存储”的操作。那他们得到的排队序号肯定有重复的。
求各位大佬指点下,要怎样处理这种并发的情况,或者有哪些文档可以学习的。
有个思路,用事务操作。用一条记录保存当前的序号,请求取号的时候,用事务操作给序号自增+1,然后读取,释放事务操作,再按普通的操作记录这个序号。因为事务操作有事务锁,可以保证同一时间只有一个自增操作。
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/transaction.html
有大佬提示了,用addToSet原子操作,把用户的openid存入队列数组,这样用户的openid位置肯定就是固定的,然后我们就直接读取更新后的队列数组,取出位置信息就行了。大佬真牛