Docs Menu

트랜잭션

이 가이드 에서는 코틀린 (Kotlin) 운전자 를 사용하여 트랜잭션 을 수행하는 방법을 학습 수 있습니다. 트랜잭션 을 사용하면 트랜잭션 이 커밋될 때까지 데이터를 변경하지 않는 일련의 작업을 실행 수 있습니다. 트랜잭션 에서 오류가 반환되는 경우 운전자 는 트랜잭션 을 취소하고 데이터 변경 사항이 표시되기 전에 모든 데이터 변경 사항을 삭제합니다.

MongoDB에서 트랜잭션은 논리적 세션 내에서 실행됩니다. 세션은 순차적으로 실행하려는 관련 읽기 또는 쓰기 작업의 그룹입니다. 세션을 사용하면 작업 그룹에 대한 인과적 일관성을 유지하거나 ACID transaction 에서 작업을 실행할 수 있습니다. MongoDB는 작업에 예상치 못한 오류가 발생하더라도 트랜잭션 작업과 관련된 데이터의 일관성을 보장합니다.

코틀린 (Kotlin) 운전자 를 사용하는 경우 MongoClient 인스턴스 에서 ClientSession 로 새 세션을 만들 수 있습니다. 매번 새 클라이언트 를 인스턴스화하는 대신 여러 세션 및 트랜잭션에 클라이언트 를 재사용하는 것이 좋습니다.

경고

ClientSession을(를) 생성한 MongoClient (또는 MongoDatabase 또는 MongoCollection)에만 ClientSession을(를) 사용합니다. 다른 MongoClient와(과) 함께 ClientSession을(를) 사용하면 작업 오류가 발생합니다.

Client 인스턴스 에서 startSession() 메서드를 사용하여 ClientSession 를 만듭니다. 그런 다음 다음 방법을 사용하여 세션 상태 를 수정할 수 있습니다.

메서드
설명

startTransaction()

Starts a new transaction for this session with the default transaction options. You cannot start a transaction if there's already an active transaction on the session.

To set transaction options, use startTransaction(transactionOptions: TransactionOptions).

abortTransaction()

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.

commitTransaction()

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.

트랜잭션 시간 초과

트랜잭션에서 작업을 완료하는 데 걸릴 수 있는 시간 제한을 설정하다 수 있습니다. 자세한 학습 은 서버 실행 시간 제한 가이드 의 트랜잭션 섹션을 참조하세요.

ClientSession 에는 세션 속성을 조회 하고 변경 가능한 세션 속성을 수정하는 메서드도 있습니다. 이러한 메서드에 대해 자세히 학습 API 문서 를 참조하세요.

이 예시 에서는 다음 코틀린 (Kotlin) 데이터 클래스를 사용하여 문서를 모델링합니다.

data class Account(
val accountId: String,
val amount: Int
)

다음 예시 에서는 세션을 생성하고, 트랜잭션 을 생성하고, 기존 문서에 변경 사항을 커밋 하는 방법을 보여줍니다.

  1. startSession() 메서드를 사용하여 클라이언트에서 세션을 만듭니다.

  2. startTransaction() 메서드를 사용하여 트랜잭션을 시작합니다.

  3. 지정된 문서를 업데이트한 다음 commitTransaction() 모든 작업이 성공하면 메서드를 사용하고,abortTransaction() 작업이 실패하면 메서드를 사용합니다.

// Set up the session
val session = client.startSession()
try {
session.startTransaction()
val savingsColl = database
.getCollection<Account>("savings_accounts")
val checkingColl = database
.getCollection<Account>("checking_accounts")
savingsColl.findOneAndUpdate(
session,
eq(Account::accountId.name, "9876"),
inc(Account::amount.name, -100),
)
checkingColl.findOneAndUpdate(
session,
eq(Account::accountId.name, "9876"),
inc(Account::amount.name, 100)
)
// Commit the transaction
val result = session.commitTransaction()
println("Transaction committed.")
} catch (error: Exception) {
println("An error occurred during the transaction: ${error.message}")
// Abort the transaction
session.abortTransaction()
}

참고

병렬 작업이 지원되지 않음

코틀린 (Kotlin) 운전자 단일 트랜잭션 내에서 실행 작업 실행을 지원 하지 않습니다.

MongoDB 서버 v8.0 이상을 사용하는 경우 대량 쓰기 (write) 작업을 사용하여 단일 트랜잭션 내에서 여러 네임스페이스에 대한 쓰기 (write) 작업을 수행할 수 있습니다. 자세한 학습 은 대량 작업 가이드 참조하세요.

이 가이드에 언급된 개념에 대해 자세히 알아보려면 서버 매뉴얼의 다음 페이지를 참조하세요.

ACID compliance 에 학습 보려면 데이터베이스 관리 시스템의 ACID 속성이란 무엇인가요?를 참조하세요. 문서를 MongoDB 웹사이트 에서 확인하세요.

이 가이드에서 설명하는 유형 또는 메서드에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.