【问题标题】:Node.js sequelize deadlock issueNode.js 续集死锁问题
【发布时间】:2020-03-04 15:58:16
【问题描述】:

我目前正在使用nodejs、sequelize、mysql和reactjs开发服务。

以下代码为一篇文章创建回复。

module.exports.reply = async ({
  userId,
  postId,
  text
}) => {
  const t1 = await orm.transaction({
    isolationLevel: orm.Transaction.ISOLATION_LEVELS.SERIALIZABLE
  });

  try {
    let retData = { code: 0, data: {}};

    const reply = await replyModel.findOne({
      where: {
        userId: userId,
        postId: postId
      },
      lock: t1.LOCK.UPDATE,
      transaction: t1
    });

    if (reply == null) {
      await replyModel.create({
        postId: postId,
        text: text
      }, {transaction: t1});
    }

    retData.code = 200;

    await t1.commit();

    return retData;
  } catch (err) {
    await t1.rollback();

    throw err;
  }
}

上面的代码是一个为文章创建回复的 POST 请求。

如果我连续点击回复按钮5~10次,就会出现死锁。

为了避免死锁,我隐藏了被点击的按钮。

但是,当回复请求发生多次时,有没有其他方法可以避免服务器端死锁?

【问题讨论】:

    标签: mysql node.js sequelize.js deadlock


    【解决方案1】:

    在回复发布之前阻止/禁用发布按钮(并且可能还显示“加载”符号)似乎是一种很好的用户体验实践。

    如果您想为您的用户提供同时更新单个数据库行的能力(例如,许多用户同时发布同一项目的更新),那么我建议使用作业队列(例如 BullMQ)按顺序应用这些更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-28
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2019-10-18
      • 2015-03-29
      相关资源
      最近更新 更多