programing

Node.js에서 데이터베이스 관련 경합 조건 방지

abcjava 2023. 7. 5. 20:01
반응형

Node.js에서 데이터베이스 관련 경합 조건 방지

개요

Node.js를 사용할 때 모델의 인스턴스를 사용할 때 비동기 안전을 보장하는 방법을 이해하려고 합니다.여기서는 코드 샘플에 Mongoose ODM을 사용하지만, 이 질문은 Node.js가 사용하는 비동기 이벤트 중심 I/O 접근 방식으로 데이터베이스를 사용하는 경우에 적용됩니다.

다음 코드(MongoDB 쿼리에 Mongoose 사용)를 고려합니다.

토막글 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' ); }
    });
});

응용프로그램의 별도 부분에서 MyModel이 설명한 문서를 업데이트할 수 있습니다.다음 코드를 고려합니다.

토막글 B

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

Snipet A에서 MongoDB 쿼리는 문서가 준비되면 실행되도록 등록된 콜백과 함께 실행됩니다.MyModel이 설명한 문서의 인스턴스는 메모리("doc" 개체)에 유지됩니다.다음과 같은 시퀀스가 발생할 수 있습니다.

  1. 코드 조각 A 실행
  2. MyModel에 대한 쿼리가 시작되어 나중에 사용할 수 있도록 콜백(콜백 A)을 등록합니다.
  3. << 노드 이벤트 루프 실행 >>
  4. MyModel이 데이터베이스에서 검색되어 등록된 콜백(콜백 A)을 실행합니다.
  5. MyOtherModel에 대한 쿼리가 시작되어 나중에 사용할 콜백을 등록합니다(콜백 B).
  6. << 노드 이벤트 루프 실행 >>
  7. 코드 조각 B가 실행됩니다.
  8. 문서(ID #1)가 업데이트되었습니다.
  9. << 노드 이벤트 루프 실행 >>
  10. MyOtherModel이 데이터베이스에서 검색되어 등록된 콜백(콜백 B)을 실행합니다.
  11. 오래된 버전의 문서(ID #1)가 비교에서 잘못 사용되었습니다.

문의사항

  1. Node.js/MongoDB에서 이러한 유형의 레이스 상태가 발생하지 않는다는 보장이 있습니까?
  2. 이 시나리오가 발생하지 않도록 결정적으로 방지하려면 어떻게 해야 합니까?

노드가 단일 스레드 방식으로 코드를 실행하는 동안 이벤트 루프의 실행 허용은 잠재적으로 오래된 데이터에 대한 문을 열어주는 것으로 보입니다.이 준수사항이 잘못되었다면 수정 부탁드립니다.

아니요, node.js/MongoDB에서 이러한 유형의 레이스 상태가 발생하지 않는다는 보장은 없습니다.그러나 node.js와는 아무런 관련이 없으며 MongoDB 뿐만 아니라 동시 액세스를 지원하는 모든 데이터베이스에서 가능합니다.

그러나 MongoDB는 일반적인 SQL 데이터베이스처럼 트랜잭션을 지원하지 않기 때문에 문제를 해결하기가 더 어렵습니다.따라서 여기 MongoDB 요리책에 설명된 것과 같은 전략을 사용하여 애플리케이션 계층에서 이 문제를 해결해야 합니다.

언급URL : https://stackoverflow.com/questions/13190885/preventing-database-related-race-conditions-in-node-js

반응형