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

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

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

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

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

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

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

다음 예는 전자상거래 애플리케이션에서 데이터 일관성을 적용하는 예시입니다. 예시 스키마는 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 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 }
]
}
]

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