개요
이 가이드 에서는 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을(를) 사용하면 작업 오류가 발생합니다.
인과 관계 일관성
MongoDB 특정 클라이언트 세션에서 인과적 일관성 지원합니다. 인과적 일관성 모델은 분산된 시스템에서 세션 내의 작업이 인과적 순서로 실행 보장 . 클라이언트는 인과 관계 또는 작업 간의 종속성과 일관적인 결과를 관찰합니다. 예시 를 들어, 한 작업이 논리적으로 다른 작업의 결과에 따라 달라지는 일련의 작업을 수행하는 경우 모든 후속 읽기에는 종속 관계 반영됩니다.
인과적 일관성 보장하려면 클라이언트 세션이 다음 요구 사항을 충족해야 합니다.
세션을 시작할 때 운전자 인과적 일관성 옵션을 활성화 해야 합니다. 이 옵션은 기본값 으로 활성화되어 있습니다.
작업은 단일 스레드의 단일 세션에서 실행 되어야 합니다. 그렇지 않으면 세션 또는 스레드가 optime 및 클러스터 시간 값을 서로 통신해야 합니다. 이러한 값을 전달하는 두 세션의 예시 보려면 MongoDB Server 매뉴얼에서 인과적 일관성 예시 를 참조하세요.
반드시
MONGOC_READ_CONCERN_LEVEL_MAJORITY읽기 고려 (read concern) 사용해야 합니다.반드시
MONGOC_WRITE_CONCERN_W_MAJORITY쓰기 고려 (write concern) 사용해야 합니다. 이는 기본값 쓰기 고려 (write concern) 값입니다.
다음 표에서는 인과적으로 일관적인 세션이 제공하는 보장 에 대해 설명합니다.
보장 | 설명 |
|---|---|
쓰기 읽기 | 읽기 작업은 이전 쓰기 (write) 작업의 결과를 반영합니다. |
단조적 읽기 | 읽기 작업은 이전 읽기 작업보다 이전 데이터 상태 반영하는 결과를 반환하지 않습니다. |
단조로운 쓰기 | 쓰기 (write) 작업이 다른 쓰기 (write) 작업보다 먼저 수행되어야 하는 경우 서버 이 쓰기 (write) 작업을 먼저 실행합니다. 예시 를 들어 |
읽기 후 쓰기 | 쓰기 (write) 작업이 다른 읽기 작업 뒤에 와야 하는 경우 서버 읽기 작업을 먼저 실행합니다. 예시 를 들어 |
팁
이 섹션에 언급된 개념에 대해 자세히 학습 다음 MongoDB Server 매뉴얼 항목을 참조하세요.
트랜잭션 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 인스턴스 에 다음 함수를 사용하여 트랜잭션 수명 주기를 더 잘 제어할 수 있습니다.
기능 | 설명 |
|---|---|
| 이 세션에서 지정된 옵션으로 구성된 새 트랜잭션을 시작합니다. 이미 트랜잭션이 진행 중인 세션과 같이 유효하지 않은 인수가 있는 경우 |
| 이 세션의 활성 트랜잭션을 종료합니다. 세션에 대한 활성 트랜잭션이 없거나 트랜잭션이 커밋되거나 종료된 경우 |
| 이 세션의 활성 트랜잭션을 커밋합니다. 세션에 대한 활성화된 트랜잭션이 없거나 트랜잭션이 종료된 경우 오류를 반환합니다. 이 함수에 대해 자세히 알아보려면 서버 매뉴얼의 commitTransaction() 페이지 를 참조하세요. |
| 진행 중인 모든 트랜잭션을 중단하고 이 세션을 종료합니다. 이 세션와 연결된 모든 클라이언트 리소스를 해제합니다. |
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!
참고
병렬 작업이 지원되지 않음
C 운전자 단일 트랜잭션 내에서 병렬 작업 실행 을 지원 하지 않습니다.
MongoDB Server v8.0 이상을 사용하는 경우 대량 쓰기 (write) 작업을 사용하여 단일 트랜잭션 내에서 여러 네임스페이스에 대한 쓰기 (write) 작업을 수행할 수 있습니다. 자세한 내용은 대량 쓰기 작업 가이드 참조하세요.
추가 정보
이 가이드 에 언급된 개념에 학습 보려면 MongoDB Server 매뉴얼의 다음 페이지를 참조하세요.
ACID compliance 에 학습 보려면 데이터베이스 관리 시스템의 ACID 속성이란 무엇인가요?를 참조하세요. 문서를 MongoDB 웹사이트 에서 확인하세요.
API 문서
이 가이드 에 설명된 유형 또는 함수에 대해 자세히 학습 다음 API 문서를 참조하세요.