Node.避免集群/pm2 的数据库争用情况



我有一个在集群模式下运行pm2的Node应用程序。

我还有一个函数可以检查特定行是否在数据库表中。如果缺少该行,它将创建该行,否则将设置并保存一个值。

对于用户 ID 和组 ID 的每个组合,我只需要一行。

function someFunction()={
  return Activation.findOne({ where: { userId: userId, groupId: groupId } })
    .then(activationObject => {
        if (!activationObject) {
          return Activation.create({ userId: userId, groupId: groupId, activationTime: sequelize.fn('NOW') })
        } else {
          activationObject.activationTime = sequelize.fn('NOW');
          return activationObject.save()
        }
    })      
}

在群集模式下运行节点时如何避免争用情况?目前,如果第一个工作线程检查该行可用,而第二个检查同时都没有结果,最后我们有两个新创建的行而不是一个。

我知道Sequelize提供了一种findOrCreate()方法,但我想要一个简单易懂的例子。

最简单的方法是使用 ON CONFLICT REPLACE 子句为 userIdgroupId 的组合添加一个 UNIQUE 约束,并始终创建新行而不是更新。这将导致新插入的行与新activationTime替换旧行。

您还可以检查插入的行数,以判断插入是否成功。

示例:UNIQUE (userId, groupId) ON CONFLICT REPLACE

我来晚了,但是如果您在第一个查询中有更复杂的事情要检查,使用具有适当隔离级别的事务可能会有所帮助

这个答案给出了一个很好的例子:TypeORM数据库锁:请解释如何使用setLock((函数在TypeORM中使用数据库锁

最新更新