문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

원자성과 트랜잭션

이 페이지의 내용

  • 원자성
  • 다중 문서 트랜잭션
  • 동시성 제어

MongoDB에서 쓰기 작업은 단일 문서 내에 포함된 여러 문서를 수정하는 경우에도 단일 문서 수준에서 원자적으로 이루어집니다.

단일 쓰기 작업(예 db.collection.updateMany())이(가) 여러 문서를 수정하는 경우, 각 문서의 수정은 원자적이지만 전체 작업은 원자적이지 않습니다.

단일 쓰기 작업이든 다중 쓰기 작업이든 다중 문서 쓰기 작업을 수행할 때 다른 작업과 겹칠 수 있습니다.

여러 문서(단일 또는 여러 컬렉션)에 대한 읽기 및 쓰기의 원자성이 필요한 상황의 경우, 복제본 세트 및 샤드 클러스터에서의 트랜잭션을 포함한 분산 트랜잭션을 지원합니다.

자세한 내용은 거래를참조하세요.

중요

대부분의 경우 분산 트랜잭션은 단일 문서 쓰기에 비해 더 큰 성능 비용이 발생하므로 분산 트랜잭션의 가용성이 효과적인 스키마 설계를 대체할 수는 없습니다. 대부분의 시나리오에서 비정규화된 데이터 모델 (내장된 문서 및 배열) 은 계속해서 데이터 및 사용 사례에 최적일 것입니다. 즉, 대부분의 시나리오에서 데이터를 적절하게 모델링하면 분산 트랜잭션의 필요성이 최소화됩니다.

추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 oplog 크기 제한)은 프로덕션 고려사항을 참조하세요.

동시성 제어를 통해 데이터 불일치나 충돌 없이 여러 애플리케이션을 동시에 실행할 수 있습니다.

문서에 대한 findAndModify 작업은 원자적이며, 찾기 조건이 문서와 일치하면 해당 문서에서 업데이트가 수행됩니다. 해당 문서에 대한 동시 쿼리 및 추가 업데이트는 현재 업데이트가 완료될 때까지 영향을 받지 않습니다.

다음 예를 고려하십시오.

  • 두 개의 문서가 있는 컬렉션

    db.myCollection.insertMany( [
    { _id: 0, a: 1, b: 1 },
    { _id: 1, a: 1, b: 1 }
    ] )
  • 다음 findAndModify 작업 중 두 가지가 동시에 실행됩니다.

    db.myCollection.findAndModify( {
    query: { a: 1 },
    update: { $inc: { b: 1 }, $set: { a: 2 } }
    } )

findAndModify 작업이 완료되면 두 문서의 ab2로 설정됨을 보장합니다.

다음도 참조하세요.

필드에 고유 고유 인덱스를 생성하여 필드에 고유한 값만 가질 수 있도록 할 수도 있습니다. 이렇게 하면 삽입 및 업데이트가 중복 데이터를 생성하는 것을 방지할 수 있습니다. 여러 필드에 고유 인덱스를 생성하여 필드 값 조합이 고유하도록 할 수 있습니다. 예시는 고유 인덱스로 findAndModify() 업서트를 참조하세요.

다음도 참조하세요.

← MongoDB CRUD 개념