트랜잭션
개요
이 가이드 에서는 Java 운전자 를 사용하여 트랜잭션 을 수행하는 방법을 학습 수 있습니다. 트랜잭션 을 사용하면 트랜잭션 이 커밋될 때까지 데이터를 변경하지 않는 일련의 작업을 실행 수 있습니다. 트랜잭션 에서 오류가 반환되는 경우 운전자 는 트랜잭션 을 취소하고 데이터 변경 사항이 표시되기 전에 모든 데이터 변경 사항을 삭제합니다.
MongoDB 에서 트랜잭션은 논리적 세션 내에서 실행 . 세션은 순차적으로 실행 하려는 관련 읽기 또는 쓰기 (write) 작업의 그룹입니다. 세션을 사용하면 원자성, 일관성, 격리 및 내구성에 대한 기대치를 충족하는 트랜잭션 인 ACID 호환 트랜잭션 에서 작업을 실행 수 있습니다.
Java 운전자 를 사용하는 경우 MongoClient
인스턴스 에서 ClientSession
유형으로 새 세션을 만들 수 있습니다. 매번 새 클라이언트 를 인스턴스화하는 대신 여러 세션 및 트랜잭션에 클라이언트 를 재사용하는 것이 좋습니다.
경고
ClientSession
을(를) 생성한 MongoClient
(또는 MongoDatabase
또는 MongoCollection
)에만 ClientSession
을(를) 사용합니다. 다른 MongoClient
와(과) 함께 ClientSession
을(를) 사용하면 작업 오류가 발생합니다.
중요
트랜잭션 에 포함하려는 모든 작업의 매개 변수로 session
를 포함해야 합니다.
인과 관계 일관성
MongoDB 특정 클라이언트 세션에서 인과적 일관성 지원합니다. 인과적 일관성 모델은 분산된 시스템에서 세션 내의 작업이 인과적 순서로 실행 보장 . 클라이언트는 인과 관계 또는 작업 간의 종속성과 일관적인 결과를 관찰합니다. 예시 를 들어, 한 작업이 논리적으로 다른 작업의 결과에 따라 달라지는 일련의 작업을 수행하는 경우 모든 후속 읽기에는 종속 관계 반영됩니다.
인과적 일관성 보장하려면 클라이언트 세션이 다음 요구 사항을 충족해야 합니다.
세션을 시작할 때 운전자 인과적 일관성 옵션을 활성화 해야 합니다. 이 옵션은 기본값 으로 활성화되어 있습니다.
작업은 단일 스레드의 단일 세션에서 실행 되어야 합니다. 그렇지 않으면 세션 또는 스레드가 작업 시간과 클러스터 시간 값을 서로 통신해야 합니다. 이러한 값을 전달하는 두 세션의 예시 보려면 MongoDB Server 매뉴얼에서 인과적 일관성 예시 를 참조하세요.
반드시
MAJORITY
읽기 고려 (read concern) 사용해야 합니다.반드시
MAJORITY
쓰기 고려 (write concern) 사용해야 합니다. 이는 기본값 쓰기 고려 (write concern) 값입니다.
다음 표에서는 인과적으로 일관적인 세션이 제공하는 보장 에 대해 설명합니다.
보장 | 설명 |
---|---|
쓰기 읽기 | 읽기 작업은 이전 쓰기 (write) 작업의 결과를 반영합니다. |
단조적 읽기 | 읽기 작업은 이전 읽기 작업보다 이전 데이터 상태 반영하는 결과를 반환하지 않습니다. |
단조로운 쓰기 | 쓰기 (write) 작업이 다른 쓰기 (write) 작업보다 먼저 수행되어야 하는 경우 서버 이 쓰기 (write) 작업을 먼저 실행합니다. 예시 를 들어 |
읽기 후 쓰기 | 쓰기 (write) 작업이 다른 읽기 작업 뒤에 와야 하는 경우 서버 읽기 작업을 먼저 실행합니다. 예시 를 들어 |
팁
이 섹션에 언급된 개념에 대해 자세히 학습 다음 MongoDB Server 매뉴얼 항목을 참조하세요.
방법
MongoClient
인스턴스 에서 startSession()
메서드를 사용하여 ClientSession
를 만듭니다. 그런 다음 ClientSession
에서 제공하는 메서드를 사용하여 세션 상태 를 수정할 수 있습니다. 다음 표에서는 트랜잭션 을 관리 하는 데 사용할 수 있는 방법에 대해 설명합니다.
메서드 | 설명 |
---|---|
| Starts a new transaction for this session with the
default transaction options. Pass an instance of TransactionOptions
as a parameter to start a transaction with given options. You
cannot start a transaction if there's already an active transaction
running in the session.Parameter: TransactionOptions transactionOptions |
| Ends the active transaction for this session. Returns an error
if there is no active transaction for the
session or the transaction was previously ended. |
| 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. |
| Starts a new transaction for this session and runs the given function. This
method handles retries, committing, and aborting transactions. Pass an
instance of TransactionBody as a parameter that defines the
operations you want to execute within the transaction.Parameter: TransactionBody<T> transactionBody |
ClientSession
에는 세션 속성을 조회 하고 변경 가능한 세션 속성을 수정하는 메서드도 있습니다. 이러한 메서드에 학습 보려면 API 설명서 를 참조하세요.
예시
다음 예시 에서는 다음 단계를 통해 세션을 만들고, 트랜잭션 을 만들고, 다중 문서 삽입 작업을 커밋 하는 방법을 보여 줍니다.
startSession()
메서드를 사용하여 클라이언트에서 세션을 만듭니다.트랜잭션 옵션을 설정하여 트랜잭션 동작을 구성합니다.
withTransaction()
메서드를 사용하여 트랜잭션을 시작합니다.여러 문서를 삽입합니다.
withTransaction()
메서드는 트랜잭션 을 실행, 커밋 및 중단합니다. 작업 중 오류가 발생하면withTransaction()
이 트랜잭션 취소를 처리합니다.
String connectionString = "<connection string>"; // Replace with your connection string try (MongoClient mongoClient = MongoClients.create(connectionString)) { MongoDatabase database = mongoClient.getDatabase("transaction_db"); MongoCollection<Document> collection = database.getCollection("books"); // Sets transaction options TransactionOptions transactionOptions = TransactionOptions.builder() .writeConcern(WriteConcern.MAJORITY) .build(); try (ClientSession session = mongoClient.startSession()) { // Uses withTransaction and lambda for transaction operations session.withTransaction(() -> { collection.insertMany(session, Arrays.asList( new Document("title", "The Bluest Eye").append("author", "Toni Morrison"), new Document("title", "Sula").append("author", "Toni Morrison"), new Document("title", "Song of Solomon").append("author", "Toni Morrison") )); return null; // Return value as expected by the lambda }, transactionOptions); } } catch (Exception e) { e.printStackTrace(); }
트랜잭션에 대한 더 많은 제어가 필요한 경우 startTransaction()
메서드를 사용할 수 있습니다. 이 메서드를 이전 섹션에서 설명한 commitTransaction()
및 abortTransaction()
메서드와 함께 사용하여 트랜잭션 수명 주기를 수동으로 관리 있습니다.
참고
병렬 작업이 지원되지 않음
Java 운전자 단일 트랜잭션 내에서 병렬 작업 실행 을 지원 하지 않습니다.
추가 정보
이 가이드에 언급된 개념에 대해 자세히 알아보려면 서버 매뉴얼의 다음 페이지를 참조하세요.
ACID compliance 에 학습 보려면 데이터베이스 관리 시스템의 ACID 속성이란 무엇인가요?를 참조하세요. 문서를 MongoDB 웹사이트 에서 확인하세요.
API 문서
이 가이드에서 설명하는 유형 또는 메서드에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.