문서 홈 → 애플리케이션 개발 → 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
작업이 완료되면 두 문서의 a
및 b
가 2
로 설정됨을 보장합니다.
팁
다음도 참조하세요.
필드에 고유 고유 인덱스를 생성하여 필드에 고유한 값만 가질 수 있도록 할 수도 있습니다. 이렇게 하면 삽입 및 업데이트가 중복 데이터를 생성하는 것을 방지할 수 있습니다. 여러 필드에 고유 인덱스를 생성하여 필드 값 조합이 고유하도록 할 수 있습니다. 예시는 고유 인덱스로 findAndModify() 업서트를 참조하세요.