gpt4 book ai didi

node.js - MongoDB - 两个更新顺序相互重叠

转载 作者:可可西里 更新时间:2023-11-01 10:21:08 26 4
gpt4 key购买 nike

我们正在为我们的系统构建大小计算机制。为了计算大小,我们从第一个原子操作开始 - findAndModify - 找到对象并为其添加锁定属性(以防止此对象的另一次计算与它交互并等到结束,因为我们可以进行许多并行计算——在这种情况下,其他计算应该推迟),然后我们计算特定属性的大小,在此操作之后——我们将元数据添加到对象并删除锁。然而,似乎有时,当我们对单个对象进行大量多次计算时(尤其是当我们并行计算大量对象时),某些更新不会执行。

_size 计算期间的元数据如下所示:

{
_lockedAt: SomeDate,
_transactionId: 'abc'
}

经过计算应该是这样的:

{
somePropertySize: 123,
anotherPropertySize: 1245,
(...)
_total: 131431523 // Some number
// Notice that both _lockedAt and _transactionId should be missing
}

这就是我们的更新流程:

return Promise.coroutine(function * () {

yield object.findOneAndUpdate({
'_id': gemId,
'_size._lockedAt': {
$exists: false
}
}, {
$set: {
'_size._lockedAt': moment.utc().toDate(),
'_size._transactionId': transactionId
}
}).then(results => results.value);

// Calculations are performed here, new _size object is built

yield object.findOneAndUpdate({
_id: gemId,
_lockedAt: {
$exists: true // We tried both with and without this property, does not change anything
}
}, {
$set: {
_size: newSizeObject
}
});

})()

第二次更新之前的示例性真实对象(为简洁起见被截断):

{ 
title: 11,
description: 2,
detailedSection: 0,
tags: 2
file: 5625898,
_total: 5625913
}

出于某种原因,当我们有多个计算彼此相邻时,有时(对于新对象,根本没有 _size 属性),对象与 _size 对象保持一致看起来与锁定后完全一样,尽管事实日志告诉我们一切顺利(计算已完成,计算了新的大小对象并调用了第二次数据库更新)。

我们使用 MongoDB 3.0,两个副本集。对正在发生的事情有什么想法吗?

最佳答案

将第二次更新放在 then 之后,这样它将等到 promise 解决:

object.findOneAndUpdate({
'_id': gemId,
'_size._lockedAt': {
$exists: false
}
}, {
$set: {
'_size._lockedAt': moment.utc().toDate(),
'_size._transactionId': transactionId
}
}).then(results => {

// Calculations are performed here, new _size object is built

object.findOneAndUpdate({
_id: gemId,
_lockedAt: {
$exists: true // We tried both with and without this property, does not change anything
}
}, {
$set: {
_size: newSizeObject
}
});
}).catch(err => console.error);

还要确保使用 catch 对 promise 进行错误处理。

如果您真的不需要锁定或交易字段,那么我会删除那些东西。如果你确实需要它们,像 RethinkDB 这样的东西可能会更好一些,或者 PostgresSQL 可以提供真实的交易。

关于node.js - MongoDB - 两个更新顺序相互重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39353751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com