Zapobieganie warunkom wyścigowym związanym z bazą danych w Node.js

Przegląd

Próbuję zrozumieć, jak zapewnić bezpieczeństwo aynchroniczne podczas korzystania z instancji modelu podczas korzystania z Node.js. Tutaj używam Mongoose ODM w przykładach kodu, ale pytanie dotyczy każdego przypadku, w którym baza danych jest używana z asynchronicznym podejściem we / wy sterowanym zdarzeniami, które stosuje Node.js.

Rozważ następujący kod (który używa zapytań Mongoose dla MongoDB):

Fragment A
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' ); }
    });
});

W osobnej części aplikacji dokument opisany przez MyModel może zostać zaktualizowany. Rozważ następujący kod:

Fragment B
MyModel.update( { _id : <id #1> }, { $set : { field1 : someValue }, callback );

W urywku A wysyłane jest zapytanie MongoDB z zarejestrowanym wywołaniem zwrotnym, które ma zostać uruchomione, gdy dokument jest gotowy. Instancja dokumentu opisanego przez MyModel jest zachowywana w pamięci (w obiekcie „doc”). Może wystąpić następująca sekwencja:

Fragment A wykonujeZapytanie jest inicjowane dla MyModel, rejestrując wywołanie zwrotne (callback A) do późniejszego wykorzystania<< Pętla zdarzenia węzła działa >>MyModel jest pobierany z bazy danych, wykonując zarejestrowane wywołanie zwrotne (wywołanie zwrotne A)Zapytanie jest inicjowane dla MyOtherModel, rejestrując wywołanie zwrotne do późniejszego wykorzystania (wywołanie zwrotne B)<< Pętla zdarzenia węzła działa >>Fragment B wykonujeDokument (nr 1) jest aktualizowany<< Pętla zdarzenia węzła działa >>MyOtherModel jest pobierany z bazy danych, wykonując zarejestrowany callback (callback B)Nieaktualna wersja dokumentu (id # 1) jest niepoprawnie używana w porównaniu.pytaniaCzy są jakieś gwarancje, że ten typ wyścigu nie będzie miał miejsca w Node.js / MongoDB?Co mogę zrobić, aby deterministycznie zapobiec temu scenariuszowi?

Podczas gdy Node uruchamia kod w sposób jednowątkowy, wydaje mi się, że wszelkie uprawnienia do uruchomienia pętli zdarzeń otwierają drzwi potencjalnie nieaktualnym danym. Proszę poprawić mnie, jeśli to przestrzeganie jest błędne.

questionAnswers(1)

yourAnswerToTheQuestion