Предотвращение связанных с базой условий гонки в Node.js

обзор

Я пытаюсь понять, как обеспечить асинхронную безопасность при использовании экземпляра модели при использовании Node.js. Здесь я использую Mongoose ODM в примерах кода, но этот вопрос относится к любому случаю, когда база данных используется с асинхронным подходом ввода-вывода, управляемым событиями, который используется Node.js.

Рассмотрим следующий код (который использует Mongoose для запросов MongoDB):

Фрагмент А
MyModel.findOne( { _id : <id #1> }, function( err, doc ) {
    MyOtherModel.findOne( { _id : someOtherId }, ( function(err, otherDoc ) {
        if (doc.field1 === otherDoc.otherField) {
            doc.field2 = 0; // assign some new value to a field on the model
        }
        doc.save( function() { console.log( 'success' ); }
    });
});

В отдельной части приложения документ, описанный MyModel, может быть обновлен. Рассмотрим следующий код:

Фрагмент Б
MyModel.update( { _id : <id #1> }, { $set : { field1 : someValue }, callback );

В фрагменте A выдается запрос MongoDB с зарегистрированным обратным вызовом, который запускается, когда документ готов. Экземпляр документа, описанного MyModel, сохраняется в памяти (в объекте "doc"). Может произойти следующая последовательность:

Фрагмент А исполняетДля MyModel инициируется запрос, регистрирующий обратный вызов (обратный вызов A) для последующего использования.<< Цикл событий Node выполняется >>MyModel извлекается из базы данных, выполняя зарегистрированный обратный вызов (обратный вызов A)Для MyOtherModel инициируется запрос, регистрирующий обратный вызов для последующего использования (обратный вызов B)<< Цикл событий Node выполняется >>Фрагмент Б исполняетДокумент (id # 1) обновлен<< Цикл событий Node выполняется >>MyOtherModel извлекается из базы данных, выполняя зарегистрированный обратный вызов (обратный вызов B)Устаревшая версия документа (id # 1) неправильно используется в сравнении.ВопросовСуществуют ли какие-либо гарантии того, что в Node.js / MongoDB такого состояния гонки не произойдет?Что я могу сделать, чтобы детерминистически предотвратить этот сценарий?

В то время как Node выполняет код однопоточным способом, мне кажется, что любое разрешение цикла обработки событий открывает дверь для потенциально устаревших данных. Пожалуйста, поправьте меня, если это соблюдение неверно.

Ответы на вопрос(1)

Ваш ответ на вопрос