并发之前保存允许重复的调用

Concurrent beforeSave calls allowing duplicates

本文关键字:许重复 调用 保存 并发      更新时间:2023-09-26

为了防止创建某些对象,我在该类型的对象之前保存云函数中设置了一个条件。

但是,当同时创建两个对象时,条件不会相应地起作用。

这是我的代码:

Parse.Cloud.beforeSave("Entry", function(request, response) {
    var theContest = request.object.get("contest");
    theContest.fetch().then(function(contest){
      if (contest.get("isFilled") == true) {
          response.error('This contest is full.');
      } else {
          response.success();
    });
});

基本上,如果比赛已满,我不希望创建 Entry 对象。但是,如果比赛中还剩 1 个名额,并且同时保存了两个条目,则它们都会被添加。

我知道这是一个边缘情况,但也是一个合理的担忧。

Parse使用的是Mongodb,这是一个NoSQL数据库,旨在非常可扩展,因此提供有限的同步功能。您在这里真正需要的是相互排斥,不幸的是,Boolean字段不支持这种互斥。但是,Parse 为计数器和数组字段提供了原子性,您可以使用这些字段来强制实施某些控制。

见 http://blog.parse.com/announcements/new-atomic-operations-for-arrays/和 https://parse.com/docs/js/guide#objects-updating-objects

通过使用增量

然后在保存回调中执行检查(而不是获取对象并检查其上的布尔值)解决了这个问题。

看起来像这样:

Parse.Cloud.beforeSave("Entry", function(request, response) {
  var theContest = request.object.get("contest");
  theContest.increment("entries");
  theContest.save().then(function(contest) {
    if (contest.get("entries") > contest.get("maxEntries")) {
      response.error('The contest is full.');
    } else {
      response.success();
    }
  });
}