AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.

트랜잭션으로 데이터 일관성 강화

트랜잭션을 사용하여 중복된 데이터가 포함된 컬렉션 간에 일관성을 시행할 수 있습니다. 트랜잭션은 원자 조작으로 여러 컬렉션을 업데이트합니다.

애플리케이션이 항상 최신 데이터를 반환해야 하고 읽기 작업이 많은 기간 동안 잠재적인 부정적인 성능 영향을 허용할 수 있는 경우, 트랜잭션을 사용하여 일관성을 강화합니다.

트랜잭션은 데이터 일관성을 적용하는 다른 방법보다 성능이 떨어질 수 있습니다. 읽기 성능은 트랜잭션이 열려 있는 동안 부정적인 영향을 받을 수 있습니다. 그러나 트랜잭션을 통해 클라이언트가 읽은 데이터가 항상 최신 상태인지 확인할 수 있습니다.

트랜잭션을 사용하려면 복제본 세트 또는 샤딩된 클러스터에 연결해야 합니다. 독립형 배포에서는 트랜잭션을 사용할 수 없습니다.

데이터 일관성을 시행하는 다양한 방법을 검토하여 트랜잭션이 애플리케이션에 가장 적합한 접근 방식인지 확인하세요. 자세한 내용은 데이터 일관성을 참조하세요.

다음 예는 전자상거래 애플리케이션에서 데이터 일관성을 적용하는 예시입니다. 예시 스키마는 products 및 sellers 컬렉션의 제품 정보를 복제합니다. 이 스키마 설계는 제품 및 판매자 모두에 대한 쿼리를 최적화합니다.

가격이 변경되는 경우와 같이 제품이 업데이트되는 경우 products 및 sellers 컬렉션에서 가격이 일관되게 유지되는 것이 중요합니다. 따라서 트랜잭션은 이 애플리케이션에서 데이터 일관성을 시행하는 합리적인 방법입니다.

1
use test db.products.insertMany( [ { sellerId: 456, name: "sweater", price: 30, rating: 4.9 }, { sellerId: 456, name: "t-shirt", price: 10, rating: 4.2 }, { sellerId: 456, name: "vest", price: 20, rating: 4.7 } ])
2
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 } ] })
3

참고

다음 예시에서는 mongosh의 트랜잭션을 사용합니다. MongoDB 드라이버에 대한 트랜잭션 예시를 보려면 트랜잭션을 참조하세요.

다음 예시에서는 트랜잭션을 사용하여 products 및 sellers 컬렉션 모두에서 vest 가격을 업데이트합니다.

// Start a sessionsession = db.getMongo().startSession( { readPreference: { mode: "primary" } } );productsCollection = session.getDatabase("test").products;sellersCollection = session.getDatabase("test").sellers; // Start a transactionsession.startTransaction( { readConcern: { level: "local" }, writeConcern: { w: "majority" } } ); // Operations inside the transactiontry { 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 startsession.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 } ] }]

데이터 일관성을 적용하는 다른 방법을 확인하려면 다음을 참조하세요.