개요
이 가이드에서는 Rust 드라이버를 사용하여 트랜잭션을 수행하는 방법을 배울 수 있습니다. 트랜잭션을 사용하면 전체 트랜잭션이 커밋된 경우에만 데이터를 변경하는 일련의 작업을 수행할 수 있습니다. 트랜잭션의 작업이 성공하지 못하면 드라이버는 트랜잭션을 중지하고 모든 데이터 변경 사항이 표시되기 전에 삭제합니다. 이 기능을 원자성이라고 합니다.
MongoDB에서 트랜잭션은 논리적 세션 내에서 실행됩니다. 세션은 순차적으로 실행하려는 관련 읽기 또는 쓰기 작업을 그룹화한 것입니다. 세션을 사용하면 작업 그룹에 인과적 일관성을 부여하고 원자성, 일관성, 격리 및 내구성에 대한 기대치를 충족하는 트랜잭션인 ACID 호환 트랜잭션에서 작업을 실행할 수 있습니다. MongoDB는 작업에 예기치 않은 오류가 발생하더라도 트랜잭션 작업과 관련된 데이터의 일관성을 보장합니다.
Rust 드라이버를 사용하는 경우 인스턴스에서 유형으로 새 세션을 만들 수 Client ClientSession 있습니다. 매번 새 클라이언트를 인스턴스화하는 대신 여러 세션 및 트랜잭션에 클라이언트를 재사용하여 앱 성능을 향상시킬 수 있습니다.
경고
ClientSession 를 생성한 Client 에서 실행되는 작업에만 를 사용하세요. 다른 Client 와(과) 함께 ClientSession 을(를) 사용하면 작업 오류가 발생합니다.
방법
Client 인스턴스에서 start_session() 메서드를 사용하여 ClientSession 를 만듭니다. 그런 다음 ClientSession 유형에서 제공하는 메서드를 사용하여 세션 상태를 수정할 수 있습니다. 다음 표에서는 이러한 메서드에 대해 설명합니다:
메서드 | 설명 |
|---|---|
| 이 세션에서 새 트랜잭션을 시작합니다. 트랜잭션 내의 각 작업에 세션을 전달해야 합니다. 그렇지 않으면 작업이 트랜잭션 외부에서 실행됩니다. |
| 이 세션의 활성 트랜잭션을 커밋합니다. 세션에 대한 활성 트랜잭션이 없거나 트랜잭션이 이전에 종료된 경우 이 메서드는 오류를 반환합니다. |
| 이 세션의 활성 트랜잭션을 종료합니다. 이 메서드는 세션에 대한 활성 트랜잭션이 없거나 트랜잭션이 커밋 또는 종료된 경우 오류를 반환합니다. |
| 주어진 콜백을 실행한 다음 트랜잭션을 커밋하거나 종료합니다. 드라이버는 |
중요
트랜잭션에서 실행할 수 있는 메서드
트랜잭션 내에서 MongoDB 작업을 실행 하려면 session() 메서드를 작업에 연결해야 합니다. 이 메서드는 ClientSession 인스턴스 를 매개 변수로 허용합니다.
예를 예시 문서 를 삭제 일반적으로 delete_one() 메서드를 사용할 수 있습니다. 그러나 트랜잭션 내에서 문서 를 삭제 session() 메서드를 delete_one() 에 연결하고 세션을 매개 변수로 전달해야 합니다.
예시
다음 코드는 books 및 films collection에 데이터를 삽입하는 insert_media() 콜백 함수를 정의합니다.
async fn insert_media(session: &mut ClientSession) -> Result<(), Error> { let books_coll = session .client() .database("db") .collection::<Document>("books"); let films_coll = session .client() .database("db") .collection::<Document>("films"); books_coll .insert_one(doc! { "name": "Sula", "author": "Toni Morrison" }) .session(&mut *session) .await?; films_coll .insert_one(doc! { "name": "Nostalgia", "year": 1983 }) .session(&mut *session) .await?; Ok(()) }
다음 코드는 트랜잭션을 수행하기 위해 다음 조치를 완료합니다.
start_session()메서드를 사용하여 클라이언트에서 세션을 생성합니다.start_transaction()메서드를 호출하여 트랜잭션 을 시작합니다.and_run()메서드를 호출하여 트랜잭션 내에서insert_media()콜백 함수를 실행 합니다.
let mut session = client.start_session().await?; session .start_transaction() .and_run((), |session, _| insert_media(session).boxed()) .await?; println!("Successfully committed transaction!");
Successfully committed transaction!
트랜잭션에 대한 더 많은 제어가 필요한 경우 ClientSession API 문서 에서 트랜잭션 수동으로 생성하고 커밋 방법을 보여주는 예시 찾아보세요.
참고
병렬 작업이 지원되지 않음
Rust 운전자 단일 트랜잭션 내에서 병렬 작업 실행 을 지원 하지 않습니다.
MongoDB Server v8.0 이상을 사용하는 경우 대량 쓰기 (write) 작업을 사용하여 단일 트랜잭션 내에서 여러 네임스페이스에 대한 쓰기 (write) 작업을 수행할 수 있습니다. 자세한 내용은 대량 작업 가이드 참조하세요.
추가 정보
이 가이드에 언급된 개념에 대해 자세히 알아보려면 서버 매뉴얼의 다음 페이지를 참조하세요.
ACID compliance 에 학습 보려면 데이터베이스 관리 시스템의 ACID 속성이란 무엇인가요?를 참조하세요. 문서를 MongoDB 웹사이트 에서 확인하세요.
삽입 작업에 대해 자세히 알아보려면 문서 삽입 가이드를 참조하세요.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.