[英]MongoDB: findOneAndUpdate seems to be not atomic
我正在使用nodejs + mongodb作為廣泛分布的Web應用程序的后端。 我有一系列事件,需要按特定順序進行。 有多個服務會生成這些事件,我的應用程序應在事件進入時對其進行處理和存儲,並且在任何給定的時間我都希望它們以正確的順序進行處理。
我不能依賴時間戳,因為javascript僅提供以毫秒為單位的時間戳,這對於我的情況而言不夠准確。
我的數據庫中有兩個集合。 一個存儲事件,另一個存儲索引,代表我的事件順序。 我嘗試使用findOneAndUpdate來原子地增加索引。 但是,這似乎不起作用。
console.log('Adding');
console.log(event.type);
this._db.collection('evtidx').findOneAndUpdate({ id : 'index' }, { $inc: { value : 1 } }, (err, res) => {
console.log('For '+event.type);
console.log('Got value: '+res.value.value);
event.index = res.value.value;
this._db.collection('events').insertOne(event, (err, evtres) => {
if (err) {
throw err;
}
});
});
當我檢查上面代碼的輸出時,我看到:
添加事件1
添加事件2
添加事件3
添加事件4
對於Event1獲得值:1
對於Event3獲得值:4
對於Event2獲得值:2
對於Event4獲得值:3
我的結論是,我的代碼不是原子工作的。 事件以正確的索引進來,但是在findOneAndUpdate之后沒有正確的順序附加到事件。 有人可以幫我嗎?
原子數據庫操作並不意味着它們在請求運行時鎖定數據庫。 也許您正在按順序獲取請求,但是它們沒有按順序執行,也沒有在后端或數據庫中執行。
您需要做的是從“事件”集合中讀取最后一個文檔索引。 如果它小於您當前的請求索引,則插入else等待並重試。
盡管如果一個事件由於網絡錯誤或其他原因而失敗,則可能導致問題。 然后,您的請求處理將停止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.