Node.js 使用 cluster/pm2 避免数据库竞争条件
Node.js avoid db race condition with cluster/pm2
我有一个 Node 应用程序,它使用 pm2 在集群模式下运行。
我还有一个函数可以检查特定行是否在数据库中 table。如果缺少该行,则创建该行,否则设置并保存一个值。
对于 userId 和 groupId 的每个组合,我只需要一行。
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
子句为 userId
和 groupId
的组合添加一个 UNIQUE
约束,并且总是创建一个新行的更新。这将导致使用新 activationTime
的新插入行替换旧行。
您还可以通过查看插入的行数来判断插入是否成功。
示例:UNIQUE (userId, groupId) ON CONFLICT REPLACE
我有一个 Node 应用程序,它使用 pm2 在集群模式下运行。
我还有一个函数可以检查特定行是否在数据库中 table。如果缺少该行,则创建该行,否则设置并保存一个值。
对于 userId 和 groupId 的每个组合,我只需要一行。
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
子句为 userId
和 groupId
的组合添加一个 UNIQUE
约束,并且总是创建一个新行的更新。这将导致使用新 activationTime
的新插入行替换旧行。
您还可以通过查看插入的行数来判断插入是否成功。
示例:UNIQUE (userId, groupId) ON CONFLICT REPLACE