在我的Parse后端,我有一个包含唯一编号代码的数组,因此用户必须无法获得相同的代码两次。出于这个原因,在某个表的某一列的某处,我保留了这个数组的索引。
现在有一个非常简单的操作 - 用户要求一个唯一的代码。云函数递增索引的当前值,并在新索引处返回数组的值。问题是乍一看Parse JS API只有原子执行的递增操作,而不是后续的读操作,因为increment不会返回一个带有在 THAT 增量期间设置的值的promise。
现在假设以下场景(伪代码):
字段index
的值为76
,两个用户同时尝试获取下一个代码:
User1 - > increment('index') -> save -> then(obj1) -> return array[obj1.index]
User2 - > increment('index') -> save -> then(obj2) -> return array[obj2.index]
现在,原子增量将保证在这两次调用之后索引列的值为78
。但是obj1
和obj2
呢?如果它们的值读取不是与增量操作一起原子地完成,而是在执行增量后通过提取完成,那么它们都可能具有值78
!整个唯一性逻辑将被打破。
有没有办法在Parse中获取原子写操作结果?
答案 0 :(得分:2)
增量确实返回原子递增的最终值:
首先进行单元测试以显示它的使用方式:
fit('increment', (done) => {
new Parse.Object('Counter')
.set('value', 1)
.save()
.then(result => {
console.log('just saved', JSON.stringify(result));
return result
.increment('value')
.save();
})
.then(result => {
console.log('incremented', JSON.stringify(result))
expect(result.get('value')).toBe(2);
done();
})
.catch(done.fail);
});
在幕后,这里发生了什么(如果你正在使用mongo,那里也有类似的事情):