解析服务器原子增量结果
Parse server atomic increment result
在我的 Parse 后端中,我有一个包含唯一数字代码的数组,因此用户不能两次获得相同的代码。出于这个原因,在一些 table 的列中的某处,我保留了该数组的索引。
现在有一个很简单的操作——用户求一个唯一码。云函数递增索引的当前值和 returns 数组在新索引处的值。问题在于,乍一看 Parse JS API 仅以原子方式执行增量操作,但没有执行以下读取操作,因为增量不会 return 具有在 [= 期间设置的值的承诺34=]那个增量。
现在想象以下场景(伪代码):
字段index
有值76
,两个用户同时尝试获取下一个代码:
用户 1 -> increment('index') -> save -> then(obj1) -> return array[obj1.index]
用户 2 -> increment('index') -> save -> then(obj2) -> return array[obj2.index]
现在原子增量将保证在这 2 次调用之后索引列将具有值 78
。但是 obj1
和 obj2
呢?如果他们的值读取不是和自增操作一起原子地完成的,而是在执行完自增后通过fetch完成的,那么他们可能都有值78
!并且整个唯一性逻辑将被打破。
有没有办法在 Parse 中获取原子写操作结果?
增量 return 原子递增的最终值:
首先是单元测试来展示它是如何使用的:
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,postgress 也有类似的情况):
- MongoAdapter
变成 mongo $inc 操作,即 returned
- Mongo 解释 $inc 的文档,其中包括“$inc 是单个文档中的原子操作。”
在我的 Parse 后端中,我有一个包含唯一数字代码的数组,因此用户不能两次获得相同的代码。出于这个原因,在一些 table 的列中的某处,我保留了该数组的索引。
现在有一个很简单的操作——用户求一个唯一码。云函数递增索引的当前值和 returns 数组在新索引处的值。问题在于,乍一看 Parse JS API 仅以原子方式执行增量操作,但没有执行以下读取操作,因为增量不会 return 具有在 [= 期间设置的值的承诺34=]那个增量。
现在想象以下场景(伪代码):
字段index
有值76
,两个用户同时尝试获取下一个代码:
用户 1 -> increment('index') -> save -> then(obj1) -> return array[obj1.index]
用户 2 -> increment('index') -> save -> then(obj2) -> return array[obj2.index]
现在原子增量将保证在这 2 次调用之后索引列将具有值 78
。但是 obj1
和 obj2
呢?如果他们的值读取不是和自增操作一起原子地完成的,而是在执行完自增后通过fetch完成的,那么他们可能都有值78
!并且整个唯一性逻辑将被打破。
有没有办法在 Parse 中获取原子写操作结果?
增量 return 原子递增的最终值:
首先是单元测试来展示它是如何使用的:
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,postgress 也有类似的情况):
- MongoAdapter 变成 mongo $inc 操作,即 returned
- Mongo 解释 $inc 的文档,其中包括“$inc 是单个文档中的原子操作。”