트랜잭션
개요
이 가이드 에서는 C 운전자 를 사용하여 트랜잭션을 수행하는 방법을 학습 수 있습니다. 트랜잭션을 사용하면 전체 트랜잭션 이 커밋된 경우에만 데이터를 변경하는 일련의 작업을 수행할 수 있습니다. 트랜잭션 의 작업이 성공하지 못하면 라이브러리는 트랜잭션 을 중지하고 데이터 변경 사항이 표시되기 전에 모든 데이터 변경 사항을 삭제합니다. 이 기능 을 원자성 이라고 합니다.
MongoDB 에서 트랜잭션은 논리적 세션 내에서 실행 됩니다. 세션은 순차적으로 실행 하려는 관련 읽기 또는 쓰기 (write) 작업의 그룹입니다. 세션을 활성화 작업 그룹 에 인과적 일관성 을 부여하고 원자성, 일관성, 격리 및 내구성에 대한 기대치를 충족하는 트랜잭션 인 ACID 호환 트랜잭션 에서 작업을 실행 수 있습니다. MongoDB 는 작업에 예기치 않은 오류가 발생하더라도 트랜잭션 작업과 관련된 데이터가 일관적인 을 유지하도록 보장 합니다.
C 운전자 를 사용하는 경우 mongoc_client_t
인스턴스 에서 새 세션을 만들 수 있습니다. 그런 다음 결과 mongoc_client_session_t
인스턴스 를 사용하여 트랜잭션을 수행할 수 있습니다.
경고
mongoc_client_session_t
을(를) 생성한 mongoc_client_t
(또는 mongoc_database_t
또는 mongoc_collection_t
)에만 mongoc_client_session_t
을(를) 사용합니다. 다른 mongoc_client_t
와(과) 함께 mongoc_client_session_t
을(를) 사용하면 작업 오류가 발생합니다.
트랜잭션 API
이 섹션에서는 C 운전자 에서 제공하는 트랜잭션 API에 학습 수 있습니다. 트랜잭션 을 시작하기 전에 mongoc_client_t
인스턴스 에서 mongoc_client_start_session()
함수를 사용하여 mongoc_client_session_t
를 만들어야 합니다. 그런 다음 다음 API 중 하나를 사용하여 트랜잭션 을 수행할 수 있습니다.
Convenient API
C 운전자 는 트랜잭션 라이프사이클을 관리 하기 위해 편리한 트랜잭션 API 를 제공합니다. 트랜잭션 mongoc_client_session_with_transaction()
내에서 사용자 지정 콜백 을 실행 하려면 함수를 사용하여 이 API 를 구현합니다.mongoc_client_session_with_transaction()
함수는 다음 작업을 수행합니다.
트랜잭션 시작
트랜잭션 을 종료하거나 다시 시도하여 오류를 처리합니다(예: 작업으로 인해
TransientTransactionError
트랜잭션 을 커밋합니다.
이 가이드 의 트랜잭션 예제 섹션에서는 이 API 를 사용하여 트랜잭션 을 수행하는 방법을 보여 줍니다.
Core API
또는 mongoc_client_session_t
인스턴스 에 다음 함수를 사용하여 트랜잭션 수명 주기를 더 잘 제어할 수 있습니다.
기능 | 설명 |
---|---|
| Starts a new transaction, configured with the given options, on
this session. Returns false and sets the provided error if there are
invalid arguments, such as a session with a transaction already in progress. To
learn more about this function, see the startTransaction() page in the Server manual. |
| Ends the active transaction for this session. Returns false and sets the provided
error if there is no active transaction for the session or the
transaction has been committed or ended. To learn more about
this function, see the abortTransaction() page in the Server manual. |
| Commits the active transaction for this session. Returns an
error if there is no active transaction for the session or if the
transaction was ended. To learn more about
this function, see the commitTransaction() page in the Server manual. |
| Aborts any transactions in progress and ends this session. Frees
all client resources associated with this session. |
mongoc_client_session_t
속성을 조회 하고 변경 가능한 세션 속성을 수정하는 함수에 학습 보려면 API 설명서를 참조하세요.
트랜잭션 예시
이 예시 에서는 은행 트랜잭션 를 위해 sample_bank
데이터베이스 컬렉션의 데이터를 수정하는 콜백 함수를 정의합니다. 이 코드는 다음 조치를 수행합니다.
mongoc_client_session_t
인스턴스 를 매개변수로 수신하는 콜백 함수를 정의합니다.대상 컬렉션에 액세스 하기 위해
mongoc_collection_t
인스턴스를 만듭니다.계정 간에 이체할 계정 번호와 금액을 지정합니다.
송금을 반영하도록 고객의 잔액을 업데이트합니다.
타임스탬프와 함께 트랜잭션 영수증을 기록합니다.
트랜잭션 이 성공적으로 커밋된 경우 메시지를 인쇄합니다.
bool transaction_callback (mongoc_client_session_t *session, void *ctx, bson_t **reply, bson_error_t *error) { BSON_UNUSED(ctx); BSON_UNUSED(reply); mongoc_client_t *client = mongoc_client_session_get_client (session); mongoc_collection_t *checking = mongoc_client_get_collection (client, "sample_bank", "checking"); mongoc_collection_t *savings = mongoc_client_get_collection (client, "sample_bank", "savings"); mongoc_collection_t *receipts = mongoc_client_get_collection (client, "sample_bank", "receipts"); const char *account_id = "123456"; int transfer_amount = 1000; bson_t *filter = BCON_NEW ("account_id", BCON_UTF8 (account_id)); bson_t *update_decrement = BCON_NEW ("$inc", "{", "balance", BCON_INT32 (-transfer_amount), "}"); bson_t *update_increment = BCON_NEW ("$inc", "{", "balance", BCON_INT32 (transfer_amount), "}"); if (!mongoc_collection_update_one (checking, filter, update_decrement, NULL, NULL, &error)) { fprintf (stderr, "Failed to update checking account: %s\n", error.message); return false; } if (!mongoc_collection_update_one (savings, filter, update_increment, NULL, NULL, &error)) { fprintf (stderr, "Failed to update savings account: %s\n", error.message); return false; } bson_t *receipt = BCON_NEW ("account_id", BCON_UTF8 (account_id), "amount", BCON_INT32 (transfer_amount), "timestamp", BCON_DATE_TIME (bson_get_monotonic_time ())); if (!mongoc_collection_insert_one (receipts, receipt, NULL, NULL, &error)) { fprintf (stderr, "Failed to insert receipt: %s\n", error.message); return false; } mongoc_collection_destroy (checking); mongoc_collection_destroy (savings); mongoc_collection_destroy (receipts); bson_destroy (filter); bson_destroy (update_decrement); bson_destroy (update_increment); bson_destroy (receipt); printf ("Transaction successful!"); return true; }
그런 다음 다음 코드를 실행 하여 트랜잭션 을 수행합니다. 이 코드는 다음 작업을 완료합니다.
mongoc_client_start_session()
함수를 사용하여 클라이언트 에서 세션을 생성합니다.mongoc_client_session_with_transaction()
함수를 호출하여 트랜잭션 을 관리 하고 세션과 콜백 을 매개 변수로 전달합니다.
mongoc_client_session_t *session = mongoc_client_start_session (client, NULL, NULL); if (!session) { fprintf (stderr, "Failed to start session\n"); mongoc_client_destroy (client); return EXIT_FAILURE; } bool result = mongoc_client_session_with_transaction (session, (mongoc_client_session_with_transaction_cb_t) transaction_callback, NULL, NULL, NULL, &error); if (!result) { fprintf (stderr, "Transaction error: %s\n", error.message); } mongoc_client_session_destroy (session); mongoc_client_destroy (client); mongoc_cleanup ();
Transaction successful!
추가 정보
이 가이드 에 언급된 개념에 학습 보려면 MongoDB Server 매뉴얼의 다음 페이지를 참조하세요.
ACID compliance 에 학습 보려면 데이터베이스 관리 시스템의 ACID 속성이란 무엇인가요?를 참조하세요. 문서를 MongoDB 웹사이트 에서 확인하세요.
API 문서
이 가이드 에 설명된 유형 또는 함수에 학습 보려면 다음 API 문서를 참조하세요.