Zapobieganie warunkom wyścigowym związanym z bazą danych w Node.js
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 AMyModel.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 BMyModel.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.