트랜잭션
개요
이 가이드에서는 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()
에 연결하고 세션을 매개 변수로 전달해야 합니다.
예시
다음 코드는 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 설명서 를 참조하세요. 을(를) 클릭하여 트랜잭션 을 수동으로 생성하고 커밋 하는 방법을 보여주는 예시 를 찾습니다.
추가 정보
이 가이드에 언급된 개념에 대해 자세히 알아보려면 서버 매뉴얼의 다음 페이지를 참조하세요.
ACID compliance 에 학습 보려면 데이터베이스 관리 시스템의 ACID 속성이란 무엇인가요?를 참조하세요. 문서를 MongoDB 웹사이트 에서 확인하세요.
삽입 작업에 학습 보려면 문서 삽입 가이드 를 참조하세요.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.