트랜잭션
개요
이 가이드 에서는 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
인스턴스를 사용합니다. Project Reactor 라이브러리 및 사용 방법에 학습 보려면 시작하기 를 참조하세요. Reactor 문서에서 확인 가능합니다. 이 가이드 에서 Project Reactor 라이브러리 메서드를 사용하는 방법에 학습 보려면 MongoDB 에 데이터 쓰기 가이드 를 참조하세요.
트랜잭션 메서드
MongoClient
인스턴스 에서 startSession()
메서드를 사용하여 ClientSession
를 만듭니다. 그런 다음 ClientSession
에서 제공하는 메서드를 사용하여 세션 상태 를 수정할 수 있습니다. 다음 표에는 트랜잭션 을 관리 하는 데 사용할 수 있는 방법이 자세히 설명되어 있습니다.
메서드 | 설명 |
---|---|
startTransaction() | Starts a new transaction, configured with the given options, on
this session. Throws an exception if there is already
a transaction in progress for the session. To learn more about
this method, see the startTransaction() page in the MongoDB Server manual. |
abortTransaction() | Ends the active transaction for this session. Throws an exception
if there is no active transaction for the session or if the
transaction is already committed or ended. To learn more about
this method, see the abortTransaction() page in the MongoDB Server manual. |
commitTransaction() | Commits the active transaction for this session. Throws an exception
if there is no active transaction for the session or if the
transaction was ended. To learn more about
this method, see the commitTransaction() page in the MongoDB Server manual. |
트랜잭션 예시
다음 예시 에서는 한 번의 트랜잭션 으로 세션을 만들고, 트랜잭션 을 만들고, 여러 컬렉션에 문서를 삽입하는 방법을 보여 줍니다. 이 코드는 다음 단계를 실행합니다.
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) );
추가 정보
이 가이드에 언급된 개념에 대해 자세히 알아보려면 서버 매뉴얼의 다음 페이지를 참조하세요.
API 문서
이 가이드에서 설명하는 유형 또는 메서드에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.