개요
이 가이드 에서는 Java Reactive Streams 운전자 를 사용하여 트랜잭션 을 수행하는 방법을 학습 수 있습니다. 트랜잭션을 사용하면 모든 데이터 변경이 성공적인 때까지 적용 되지 않는 일련의 작업을 실행 수 있습니다. 트랜잭션 의 작업이 실패하면 운전자 는 트랜잭션 을 취소하고 모든 데이터 변경 사항을 표시하지 않고 삭제합니다.
MongoDB 에서 트랜잭션은 논리적 세션 내에서 실행 됩니다. 세션은 순차적으로 실행 하려는 관련 읽기 또는 쓰기 (write) 작업의 그룹입니다. 세션을 사용하면 작업 그룹 에 대해 인과적 일관성 을 활성화 하고 ACID 트랜잭션 을 실행 있습니다. MongoDB 는 작업에 예기치 않은 오류가 발생하더라도 트랜잭션 작업과 관련된 데이터가 일관적인 을 유지하도록 보장 합니다.
Java Reactive Streams 운전자 를 사용하는 경우 MongoClient 인스턴스 에서 ClientSession 유형으로 새 세션을 만들 수 있습니다. 매번 새 클라이언트 를 인스턴스화하는 대신 여러 세션 및 트랜잭션에 클라이언트 를 재사용하는 것이 좋습니다.
경고
ClientSession을(를) 생성한 MongoClient (또는 MongoDatabase 또는 MongoCollection)에만 ClientSession을(를) 사용합니다. 다른 MongoClient와(과) 함께 ClientSession을(를) 사용하면 작업 오류가 발생합니다.
샘플 데이터
이 가이드 의 예제에서는 Atlas 샘플 데이터 세트 의 sample_restaurants.restaurants 및 sample_mflix.movies 컬렉션을 사용합니다. 무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 시작하기를 참조하세요.
중요
프로젝트 리액터 라이브러리
이 가이드 에서는 Project Reactor 라이브러리를 사용하여 Java Reactive Streams 운전자 메서드에서 반환된 Publisher 인스턴스를 사용합니다. 프로젝트 Reactor 라이브러리와 사용 방법에 대해 자세히 학습 Reactor 문서에서 시작하기 참조하세요. 이 가이드에서 Project Reactor 라이브러리 메서드를 사용하는 방법에 대해 자세히 학습하려면 MongoDB에 데이터 쓰기 가이드를 참조하세요.
인과 관계 일관성
MongoDB 특정 클라이언트 세션에서 인과적 일관성 지원합니다. 인과적 일관성 모델은 분산된 시스템에서 세션 내의 작업이 인과적 순서로 실행 보장 . 클라이언트는 인과 관계 또는 작업 간의 종속성과 일관적인 결과를 관찰합니다. 예시 를 들어, 한 작업이 논리적으로 다른 작업의 결과에 따라 달라지는 일련의 작업을 수행하는 경우 모든 후속 읽기에는 종속 관계 반영됩니다.
인과적 일관성 보장하려면 클라이언트 세션이 다음 요구 사항을 충족해야 합니다.
세션을 시작할 때 운전자 인과적 일관성 옵션을 활성화 해야 합니다. 이 옵션은 기본값 으로 활성화되어 있습니다.
작업은 단일 스레드의 단일 세션에서 실행 되어야 합니다. 그렇지 않으면 세션 또는 스레드가 optime 및 클러스터 시간 값을 서로 통신해야 합니다. 이러한 값을 전달하는 두 세션의 예시 보려면 MongoDB Server 매뉴얼에서 인과적 일관성 예시 를 참조하세요.
반드시
MAJORITY읽기 고려 (read concern) 사용해야 합니다.반드시
MAJORITY쓰기 고려 (write concern) 사용해야 합니다. 이는 기본값 쓰기 고려 (write concern) 값입니다.
다음 표에서는 인과적으로 일관적인 세션이 제공하는 보장 에 대해 설명합니다.
보장 | 설명 |
|---|---|
쓰기 읽기 | 읽기 작업은 이전 쓰기 (write) 작업의 결과를 반영합니다. |
단조적 읽기 | 읽기 작업은 이전 읽기 작업보다 이전 데이터 상태 반영하는 결과를 반환하지 않습니다. |
단조로운 쓰기 | 쓰기 (write) 작업이 다른 쓰기 (write) 작업보다 먼저 수행되어야 하는 경우 서버 이 쓰기 (write) 작업을 먼저 실행합니다. 예시 를 들어 |
읽기 후 쓰기 | 쓰기 (write) 작업이 다른 읽기 작업 뒤에 와야 하는 경우 서버 읽기 작업을 먼저 실행합니다. 예시 를 들어 |
팁
이 섹션에 언급된 개념에 대해 자세히 학습 다음 MongoDB Server 매뉴얼 항목을 참조하세요.
트랜잭션 메서드
MongoClient 인스턴스 에서 startSession() 메서드를 사용하여 ClientSession 를 만듭니다. 그런 다음 ClientSession 에서 제공하는 메서드를 사용하여 세션 상태 를 수정할 수 있습니다. 다음 표에는 트랜잭션 을 관리 하는 데 사용할 수 있는 방법이 자세히 설명되어 있습니다.
메서드 | 설명 |
|---|---|
| 이 세션에서 지정된 옵션으로 구성된 새 트랜잭션 시작합니다. 세션에 대해 이미 진행 중인 트랜잭션 있는 경우 예외가 발생합니다. 이 메서드에 대해 자세히 학습 MongoDB Server 매뉴얼의 startTransaction() 페이지를 참조하세요. |
| 이 세션의 활성 트랜잭션 종료합니다. 세션에 대한 활성 트랜잭션 없거나 트랜잭션 이 이미 커밋되거나 종료된 경우 예외가 발생합니다. 이 메서드에 대해 자세히 학습 MongoDB Server 매뉴얼의 abortTransaction() 페이지를 참조하세요. |
| 이 세션의 활성 트랜잭션 커밋합니다. 세션에 대한 활성 트랜잭션 없거나 트랜잭션 종료된 경우 예외가 발생합니다. 이 메서드에 대해 자세히 학습 MongoDB Server 매뉴얼의 commitTransaction() 페이지를 참조하세요. |
트랜잭션 예시
다음 예시 에서는 한 번의 트랜잭션 으로 세션을 만들고, 트랜잭션 을 만들고, 여러 컬렉션에 문서를 삽입하는 방법을 보여 줍니다. 이 코드는 다음 단계를 실행합니다.
startSession()메서드를 사용하여 클라이언트 에서 세션을 생성합니다.startTransaction()메서드를 사용하여 트랜잭션 을 시작합니다.restaurants및movies컬렉션에 문서를 삽입합니다.commitTransaction()메서드를 사용하여 트랜잭션 을 커밋합니다.
MongoClient mongoClient = MongoClients.create(settings); MongoDatabase restaurantsDatabase = mongoClient.getDatabase("sample_restaurants"); MongoCollection<Document> restaurants = restaurantsDatabase.getCollection("restaurants"); MongoDatabase moviesDatabase = mongoClient.getDatabase("sample_mflix"); MongoCollection<Document> movies = moviesDatabase.getCollection("movies"); Mono.from(mongoClient.startSession()) .flatMap(session -> { // Begins the transaction session.startTransaction(); // Inserts documents in the given order return Mono.from(restaurants.insertOne(session, new Document("name", "Reactive Streams Pizza").append("cuisine", "Pizza"))) .then(Mono.from(movies.insertOne(session, new Document("title", "Java: Into the Streams").append("type", "Movie")))) // Commits the transaction .flatMap(result -> Mono.from(session.commitTransaction()) .thenReturn(result)) .onErrorResume(error -> Mono.from(session.abortTransaction()).then(Mono.error(error))) .doFinally(signalType -> session.close()); }) // Closes the client after the transaction completes .doFinally(signalType -> mongoClient.close()) // Prints the results of the transaction .subscribe( result -> System.out.println("Transaction succeeded"), error -> System.err.println("Transaction failed: " + error) );
참고
병렬 작업이 지원되지 않음
Java Reactive Streams 운전자 단일 트랜잭션 내에서 병렬 작업 실행 을 지원 하지 않습니다.
MongoDB Server v8.0 이상을 사용하는 경우 대량 쓰기 (write) 작업을 사용하여 단일 트랜잭션 내에서 여러 네임스페이스에 대한 쓰기 (write) 작업을 수행할 수 있습니다. 자세한 학습은 대량 쓰기 작업 가이드의 클라이언트 대량 쓰기 섹션을 참조하세요.
추가 정보
이 가이드에 언급된 개념에 대해 자세히 알아보려면 서버 매뉴얼의 다음 페이지를 참조하세요.
API 문서
이 가이드에서 설명하는 유형 또는 메서드에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.