문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/ /

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

이 페이지의 내용

  • 이 작업에 대하여
  • 시작하기 전에
  • 단계
  • 제품 컬렉션 생성
  • sellers 컬렉션 생성
  • 업데이트를 처리하도록 트랜잭션 구성
  • 결과
  • 제품 컬렉션 쿼리
  • 셀러 컬렉션 쿼리
  • 자세히 알아보기

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

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

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

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

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

다음 예는 전자상거래 애플리케이션에서 데이터 일관성을 적용하는 예입니다. 예제 스키마는 productssellers collection에 있는 제품 정보를 복제합니다. 이 스키마 설계는 제품과 셀러 모두에 대한 쿼리를 최적화합니다.

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

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 드라이버에 대한 트랜잭션 예시를 보려면 트랜잭션을 참조하세요 .

다음 예시에서는 트랜잭션을 사용하여 productssellers 컬렉션 모두에서 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();

가격이 업데이트되었고 데이터가 일관적인지 확인하려면 productssellers 컬렉션을 쿼리합니다.

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 }
]
}
]

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

← 데이터 일관성