【问题标题】:Sails and MySQL are creating duplicate rowsSails 和 MySQL 正在创建重复的行
【发布时间】:2015-03-23 21:46:19
【问题描述】:

我在 mysql 中使用sails,但我的异步流程出现问题,导致在我的数据库中创建了重复的行。

我有一个一对多的关系,其中一家餐厅可以有很多评论。在我的评论创建操作中,我首先在数据库中查看与新评论关联的餐厅是否已经存在。如果存在,则获取现有 ID,否则我为餐厅创建一个条目,然后使用新 ID 作为外键将评论与新餐厅相关联。

问题是当数据库中不存在的同一家餐厅同时提交多个评论时。每个评论创建都会在数据库中查找餐厅,它不会存在。因此,每一个创建都会为餐厅创建一个条目。因此,同一家餐厅将存在重复条目。

我不确定防止此问题的最佳方法是什么。有人有建议吗?这将不胜感激。谢谢。

这是我的代码:

create: function(req, res) {
//probably put this in a helper
var validAttributes = ["content", "foursquareId", "author"];
validAttributes.unshift(req.body);
var reviewParams = _.pick.apply(null, validAttributes);

async
.waterfall(
  [
    function(callback) {

      Venue
      .findOneByFoursquareId(reviewParams.foursquareId)
      .exec(function(err, existingVenue) {

        debugger;

        if (err) {
          console.log("Error: " + err);
          return res.send(500, "Error finding venue: " + err);
        }

        if (! existingVenue) {

          // The Venue Exists in the Database

          sails.venuesHelper
          .create(reviewParams.foursquareId, function(err, newVenue) {

            if (err) {
              console.log("Error creating venue: " + err);
              return res.send(500, "Error creating venue: " + err);
            }

            console.log('created : ', newVenue);
            reviewParams.venue = newVenue.id;

            callback(null);

          });

        }
        else {

          console.log('existed : ', existingVenue);

          reviewParams.venue = existingVenue.id;

          callback(null);

        }

      });

    },

    function(callback) {

      // The venue exists in the database.

      review.create(reviewParams)
      .exec(function(err, review) {

        if (err) {
          console.log("Error: " + err);
          return res.send(500, "review could not be saved: " + err);
        }

        console.log(review);

        callback(null, review);

      });

    },

  ],
  function(err, results) {

    return res.json(results);

  }
);

},

【问题讨论】:

  • 顺便说一句,Waterline 支持承诺。这将大大提高代码的清晰度。

标签: mysql node.js asynchronous sails.js


【解决方案1】:

我的方法是让fourSquareId 成为唯一键,然后第二次插入将无法插入重复记录。

您可以对插入添加一个检查,当出错时,大约一秒钟后再次尝试,如果再次失败,则抛出异常。

【讨论】:

    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 2020-05-03
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多