-
业务场景
第三方平台创建并提供了激活码列表,每个激活码只能使用一次。并将数据导入数据库中,用户在某个业务场景下获取激活码,N个用户同时请求获取计划码时,会返回同一激活码。
//获取数据
await db_activeCode.where({isUse: true}).limit(1).get()
//更新数据
if (codeRes.data.length == 1) {
const codeUpdateRes = await db_activeCode.doc(codeRes.data[0]._id).update({
isUse: true,
useDate: moment(new Date()).utcOffset(8).format("YYYY-MM-DD HH:mm:ss")
})
} else {
return null
}
测试代码:
连续发送多次请求,返回结果是同一个数据。
如何解决改问题呢
思路:
通过update更新结果updated来判断是否操作成功,如更新成功则返回该条查询数据,如更新失败则继续读取下一条数据并更新数据
async function asyncGetActiveCode(event){
return new Promise(async(resolve)=>{
let loop=true
while(loop){
const codeRes = await db_activeCode.where({
isUse:false,
}).limit(1).get()
if (codeRes.data.length == 1) {
const activeCodeObj=codeRes.data[0]
const codeUpdateRes = await db_activeCode.where({_id:activeCodeObj._id,isUse:false}).update({
isUse: true,
useDate: moment(new Date()).utcOffset(8).format("YYYY-MM-DD HH:mm:ss")
})
if(codeUpdateRes.updated==1){
loop=false
resolve(codeRes.data[0].activeCode)
}else{
console.error("更新对象",event.id,'---',codeRes.data[0].activeCode)
}
} else {
loop=false
console.log("---null")
resolve(null)
}
}
})
}
输出结果,