Docs Menu
Docs Home
/ / /
Rust 드라이버
/

트랜잭션

이 페이지의 내용

  • 개요
  • 방법
  • 예시
  • 추가 정보
  • API 문서

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

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

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

경고

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

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

메서드
설명

start_transaction()

Starts a new transaction on this session. The session must be passed into each operation within the transaction, or the operation will run outside of the transaction.

You can set transaction options by chaining TransactionOptions option builder methods to start_transaction().

Errors returned from operations run within the transaction might include a TRANSIENT_TRANSACTION_ERROR label, which indicates that the entire transaction can be ended, then retried with the expectation that it will succeed.

commit_transaction()

Commits the active transaction for this session. This method returns an error if there is no active transaction for the session or the transaction was previously ended.

This method might return an error that includes an UNKNOWN_TRANSACTION_COMMIT_RESULT label, which indicates that it is unknown if the committed transaction satisfies the set write concern. If you encounter this error, it is safe to retry the commit until the write concern is satisfied or the method returns an error without the label.

abort_transaction()

Ends the active transaction for this session. This method returns an error if there is no active transaction for the session or if the transaction was committed or ended.

and_run()

Runs the given callback, then commits or ends the transaction. The driver retries callbacks and commits that raise an error with a TRANSIENT_TRANSACTION_ERROR label. If they raise any other error, the driver ends the transaction and returns the error to the caller. When you use this method to perform a transaction, the driver automatically handles any errors, so you can choose to omit error handling code.

Because the callback returns a future and can be run multiple times, the Rust language closure borrowing rules for captured values can be restrictive. So, the and_run() method accepts a context parameter that is passed to the callback.

Parameters: context C, callback 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 v 이상을 사용하는8.0 경우 대량 쓰기 (write) 작업을 사용하여 단일 트랜잭션 내에서 여러 네임스페이스에 대한 쓰기 (write) 작업을 수행할 수 있습니다. 자세한 내용은 대량 작업 가이드 를 참조하세요.

이 가이드에 언급된 개념에 대해 자세히 알아보려면 서버 매뉴얼의 다음 페이지를 참조하세요.

ACID compliance 에 학습 보려면 데이터베이스 관리 시스템의 ACID 속성이란 무엇인가요?를 참조하세요. 문서를 MongoDB 웹사이트 에서 확인하세요.

삽입 작업에 대해 자세히 알아보려면 문서 삽입 가이드를 참조하세요.

이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.

돌아가기

Atlas search 인덱스