簡體   English   中英

MongoDB:findOneAndUpdate似乎不是原子的

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM