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

트랜잭션

이 가이드에서는 Rust 드라이버를 사용하여 트랜잭션을 수행하는 방법을 배울 수 있습니다. 트랜잭션을 사용하면 전체 트랜잭션이 커밋된 경우에만 데이터를 변경하는 일련의 작업을 수행할 수 있습니다. 트랜잭션의 작업이 성공하지 못하면 드라이버는 트랜잭션을 중지하고 모든 데이터 변경 사항이 표시되기 전에 삭제합니다. 이 기능을 원자성이라고 합니다.

MongoDB에서 트랜잭션은 논리적 세션 내에서 실행됩니다. 세션은 순차적으로 실행하려는 관련 읽기 또는 쓰기 작업을 그룹화한 것입니다. 세션을 사용하면 작업 그룹에 인과적 일관성을 부여하고 원자성, 일관성, 격리 및 내구성에 대한 기대치를 충족하는 트랜잭션인 ACID 호환 트랜잭션에서 작업을 실행할 수 있습니다. MongoDB는 작업에 예기치 않은 오류가 발생하더라도 트랜잭션 작업과 관련된 데이터의 일관성을 보장합니다.

Rust 드라이버를 사용하는 경우 인스턴스에서 유형으로 새 세션을 만들 수 Client ClientSession 있습니다. 매번 새 클라이언트를 인스턴스화하는 대신 여러 세션 및 트랜잭션에 클라이언트를 재사용하여 앱 성능을 향상시킬 수 있습니다.

경고

ClientSession 를 생성한 Client 에서 실행되는 작업에만 를 사용하세요. 다른 Client 와(과) 함께 ClientSession 을(를) 사용하면 작업 오류가 발생합니다.

Client 인스턴스에서 start_session() 메서드를 사용하여 ClientSession 를 만듭니다. 그런 다음 ClientSession 유형에서 제공하는 메서드를 사용하여 세션 상태를 수정할 수 있습니다. 다음 표에서는 이러한 메서드에 대해 설명합니다:

메서드
설명

start_transaction()

이 세션에서 새 트랜잭션을 시작합니다. 트랜잭션 내의 각 작업에 세션을 전달해야 합니다. 그렇지 않으면 작업이 트랜잭션 외부에서 실행됩니다.

start_transaction()TransactionOptions 옵션 빌더 메서드를 연결하여 트랜잭션 옵션을 설정할 수 있습니다.

트랜잭션 내에서 실행된 작업에서 반환된 오류에는 TRANSIENT_TRANSACTION_ERROR 레이블이 포함될 수 있습니다. 이 레이블은 전체 트랜잭션을 종료한 후 성공할 것으로 예상하고 다시 시도할 수 있음을 나타냅니다.

commit_transaction()

이 세션의 활성 트랜잭션을 커밋합니다. 세션에 대한 활성 트랜잭션이 없거나 트랜잭션이 이전에 종료된 경우 이 메서드는 오류를 반환합니다.

이 메서드는 커밋된 트랜잭션이 설정된 쓰기 고려 (write concern)를 충족하는지 여부가 알 수 없다는 것을 나타내는 UNKNOWN_TRANSACTION_COMMIT_RESULT 레이블이 포함된 오류를 반환할 수 있습니다. 이 오류가 발생하면 쓰기 고려 (write concern)가 충족될 때까지 또는 메서드가 레이블 없이 오류를 반환할 때까지 커밋을 다시 시도할 수 있습니다.

abort_transaction()

이 세션의 활성 트랜잭션을 종료합니다. 이 메서드는 세션에 대한 활성 트랜잭션이 없거나 트랜잭션이 커밋 또는 종료된 경우 오류를 반환합니다.

and_run()

주어진 콜백을 실행한 다음 트랜잭션을 커밋하거나 종료합니다. 드라이버는 TRANSIENT_TRANSACTION_ERROR 레이블이 있는 오류를 발생시키는 콜백과 커밋을 다시 시도합니다. 다른 오류가 발생하면 드라이버는 트랜잭션을 종료하고 호출자에게 오류를 반환합니다. 이 메서드를 사용하여 트랜잭션을 수행하면 드라이버가 오류를 자동으로 처리하므로 오류 처리 코드를 생략할 수 있습니다.

콜백이 미래를 반환하고 여러 번 실행될 수 있으므로 캡처된 값에 대한 Rust 언어 클로저 차용 규칙이 제한적일 수 있습니다. 따라서 and_run() 메서드는 콜백에 전달되는 컨텍스트 매개변수를 허용합니다.

매개변수: 컨텍스트 C, 콜백 FnMut(&'a mut ClientSession, &'a mut C)

중요

트랜잭션에서 실행할 수 있는 메서드

트랜잭션 내에서 MongoDB 작업을 실행 하려면 session() 메서드를 작업에 연결해야 합니다. 이 메서드는 ClientSession 인스턴스 를 매개 변수로 허용합니다.

예를 예시 문서 를 삭제 일반적으로 delete_one() 메서드를 사용할 수 있습니다. 그러나 트랜잭션 내에서 문서 를 삭제 session() 메서드를 delete_one() 에 연결하고 세션을 매개 변수로 전달해야 합니다.

다음 코드는 booksfilms 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(())
}

다음 코드는 트랜잭션을 수행하기 위해 다음 조치를 완료합니다.

  1. start_session() 메서드를 사용하여 클라이언트에서 세션을 생성합니다.

  2. start_transaction() 메서드를 호출하여 트랜잭션 을 시작합니다.

  3. 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 문서를 참조하세요.