트랜잭션으로 데이터 일관성 강화
트랜잭션 을 사용하여 중복 데이터가 포함된 컬렉션 간에 일관성 을 시행하다 수 있습니다. 트랜잭션은 단일 원자 조작 으로 여러 컬렉션을 업데이트 합니다.
애플리케이션이 항상 최신 데이터를 반환해야 하고 읽기 작업이 많은 기간 동안 잠재적인 부정적인 성능 영향을 허용할 수 있는 경우, 트랜잭션을 사용하여 일관성을 강화합니다.
트랜잭션은 데이터 일관성을 적용하는 다른 방법보다 성능이 떨어질 수 있습니다. 읽기 성능은 트랜잭션이 열려 있는 동안 부정적인 영향을 받을 수 있습니다. 그러나 트랜잭션을 통해 클라이언트가 읽은 데이터가 항상 최신 상태인지 확인할 수 있습니다.
이 작업에 대하여
트랜잭션을 사용하려면 복제본 세트 또는 샤딩된 클러스터에 연결해야 합니다. 독립형 배포에서는 트랜잭션을 사용할 수 없습니다.
시작하기 전에
데이터 일관성을 시행하는 다양한 방법을 검토하여 트랜잭션이 애플리케이션에 가장 적합한 접근 방식인지 확인하세요. 자세한 내용은 데이터 일관성을 참조하세요.
단계
다음 예는 전자상거래 애플리케이션에서 데이터 일관성을 적용하는 예입니다. 예제 스키마는 products
및 sellers
collection에 있는 제품 정보를 복제합니다. 이 스키마 설계는 제품과 셀러 모두에 대한 쿼리를 최적화합니다.
가격이 변경되는 경우와 같이 제품이 업데이트되는 경우 products
및 sellers
컬렉션에서 가격이 일관되게 유지되는 것이 중요합니다. 따라서 트랜잭션은 이 애플리케이션에서 데이터 일관성을 시행하는 합리적인 방법입니다.
sellers 컬렉션 생성
use test db.sellers.insertOne( { id: 456, name: "Cool Clothes Co", location: { address: "21643 Andreane Shores", state: "Ohio", country: "United States" }, phone: "567-555-0105", products: [ { name: "sweater", price: 30 }, { name: "t-shirt", price: 10 }, { name: "vest", price: 20 } ] } )
업데이트를 처리하도록 트랜잭션 구성
다음 예시에서는 트랜잭션을 사용하여 products
및 sellers
컬렉션 모두에서 vest
가격을 업데이트합니다.
// Start a session session = db.getMongo().startSession( { readPreference: { mode: "primary" } } ); productsCollection = session.getDatabase("test").products; sellersCollection = session.getDatabase("test").sellers; // Start a transaction session.startTransaction( { readConcern: { level: "local" }, writeConcern: { w: "majority" } } ); // Operations inside the transaction try { productsCollection.updateOne( { sellerId: 456, name: "vest" }, { $set: { price: 25 } } ); sellersCollection.updateOne( { }, { $set: { "products.$[element].price": 25 } }, { arrayFilters: [ { "element.name": "vest" } ] } ); } catch (error) { // Cancel transaction on error session.abortTransaction(); throw error; } // Commit the transaction using write concern set at transaction start session.commitTransaction(); session.endSession();
결과
가격이 업데이트되었고 데이터가 일관적인지 확인하려면 products
및 sellers
컬렉션을 쿼리합니다.
제품 컬렉션 쿼리
db.products.find( { sellerId: 456, name: "vest" } )
출력:
[ { _id: ObjectId("64d506c3ddebf45734d06c58"), sellerId: 456, name: 'vest', price: 25, rating: 4.7 } ]
셀러 컬렉션 쿼리
db.sellers.find( { id: 456, "products.name": "vest" } )
출력:
[ { _id: ObjectId("64d516d9ddebf45734d06c5a"), id: 456, name: 'Cool Clothes Co', location: { address: '21643 Andreane Shores', state: 'Ohio', country: 'United States' }, phone: '567-555-0105', products: [ { name: 'sweater', price: 30 }, { name: 't-shirt', price: 10 }, { name: 'vest', price: 25 } ] } ]
자세히 알아보기
데이터 일관성을 적용하는 다른 방법을 확인하려면 다음을 참조하세요.