Prevenindo condições de corrida relacionadas ao banco de dados no Node.js

visão global

Eu estou tentando entender como garantir a segurança assíncrona ao usar uma instância de um modelo ao usar o Node.js. Aqui, eu uso o ODM do Mongoose em amostras de código, mas a questão se aplica a qualquer caso em que um banco de dados é usado com a abordagem de E / S assíncrona orientada a eventos que o Node.js emprega.

Considere o seguinte código (que usa o Mongoose para consultas do MongoDB):

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

Em uma parte separada do aplicativo, o documento descrito por MyModel poderia ser atualizado. Considere o seguinte código:

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

No Snippet A, uma consulta do MongoDB é emitida com um retorno de chamada registrado para ser acionado quando o documento estiver pronto. Uma instância do documento descrito por MyModel é retida na memória (no objeto "doc"). A seguinte seqüência pode ocorrer:

Snippet A executaUma consulta é iniciada para MyModel, registrando um retorno de chamada (retorno de chamada A) para uso posterior<< O loop de eventos do nó é executado >>MyModel é recuperado do banco de dados, executando o retorno de chamada registrado (retorno de chamada A)Uma consulta é iniciada para MyOtherModel, registrando um retorno de chamada para uso posterior (retorno de chamada B)<< O loop de eventos do nó é executado >>Snippet B executaO documento (id # 1) é atualizado<< O loop de eventos do nó é executado >>MyOtherModel é recuperado do banco de dados, executando o retorno de chamada registrado (retorno de chamada B)A versão obsoleta do documento (id # 1) é usada incorretamente em uma comparação.QuestõesHá alguma garantia de que esse tipo de condição de corrida não aconteça no Node.js / MongoDB?O que posso fazer para impedir deterministicamente que esse cenário aconteça?

Enquanto o Node executa o código de maneira única, parece-me que qualquer permissão do ciclo de eventos para executar abre a porta para dados potencialmente obsoletos. Por favor, corrija-me se esta observação estiver errada.

questionAnswers(1)

yourAnswerToTheQuestion