解析服务器原子增量结果

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。但是 obj1obj2 呢?如果他们的值读取不是和自增操作一起原子地完成的,而是在执行完自增后通过fetch完成的,那么他们可能都有值78!并且整个唯一性逻辑将被打破。

有没有办法在 Parse 中获取原子写操作结果?

增量 return 原子递增的最终值:

  1. 首先是单元测试来展示它是如何使用的:

    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);
      });
    
  2. 在幕后,这是正在发生的事情(如果您使用 mongo,postgress 也有类似的情况):

    • MongoAdapter 变成 mongo $inc 操作,即 returned
    • Mongo 解释 $inc 的文档,其中包括“$inc 是单个文档中的原子操作。”