드라이버 API
콜백 API와 코어 API
트랜잭션을 시작하고, 지정된 작업을 실행하며, 커밋(또는 오류 발생 시 중단)합니다.
TransientTransactionError
및UnknownTransactionCommitResult
에 대한 오류 처리 로직을 자동으로 통합합니다.
트랜잭션을 시작하고 커밋하려면 명시적인 호출이 필요합니다.
TransientTransactionError
및UnknownTransactionCommitResult
에 대한 오류 처리 로직을 통합하지 않고 대신 이러한 오류에 대한 사용자 지정 오류 처리를 통합할 수 있는 유연성을 제공합니다.
콜백 API
콜백 API는 로직을 통합합니다.
트랜잭션에
TransientTransactionError
오류가 발생한 경우 트랜잭션 전체를 다시 시도합니다.커밋에
UnknownTransactionCommitResult
오류가 발생하는 경우 커밋 작업을 다시 시도합니다.
MongoDB 6 부터 시작.2, 서버는 TransactionTooLargeForCache
오류를 수신하면 트랜잭션을 재시도하지 않습니다.
예제
➤ 오른쪽 상단의 언어 선택 드롭다운 메뉴를 사용하여 이 페이지에 있는 예제의 언어를 설정하세요.
핵심 API
코어 트랜잭션 API에는 다음과 같은 레이블이 지정된 오류에 대한 재시도 로직이 포함되어 있지 않습니다.
TransientTransactionError
. 트랜잭션의 작업이TransientTransactionError
레이블이 지정된 오류를 반환하는 경우 트랜잭션 전체를 다시 시도할 수 있습니다.TransientTransactionError
을 처리하려면 애플리케이션에 오류에 대한 재시도 로직을 명시적으로 통합해야 합니다.UnknownTransactionCommitResult
. 커밋이UnknownTransactionCommitResult
레이블이 지정된 오류를 반환하면 커밋을 다시 시도할 수 있습니다.UnknownTransactionCommitResult
을 처리하려면 애플리케이션에 오류에 대한 재시도 로직을 명시적으로 통합해야 합니다.
예제
➤ 오른쪽 상단의 언어 선택 드롭다운 메뉴를 사용하여 이 페이지에 있는 예제의 언어를 설정하세요.
다음 예제에는 일시적인 오류에 대해 트랜잭션을 다시 시도하고 알 수 없는 커밋 오류에 대해 커밋을 다시 시도하는 로직이 포함되어 있습니다.
드라이버 버전
트랜잭션 오류 처리
데이터베이스 시스템(MongoDB 또는 관계형 데이터베이스)에 관계없이 애플리케이션은 트랜잭션 커밋 중 오류를 처리하고 트랜잭션에 대한 재시도 로직을 통합하는 조치를 취해야 합니다.
TransientTransactionError
트랜잭션 내부의 개별 쓰기 작업은 값에 관계없이 재시도할 수 없습니다. 작업 에서 retryWrites
레이블과 관련된 오류가 발생하는 경우 "TransientTransactionError"
, 예를 들어 프라이머리가 강등된 경우 트랜잭션 전체를 다시 시도할 수 있습니다.
콜백 API는
"TransientTransactionError"
에 대한 재시도 로직을 통합합니다.코어 트랜잭션 API에는
"TransientTransactionError"
에 대한 재시도 로직이 통합되어 있지 않습니다."TransientTransactionError"
을 처리하려면 애플리케이션에 오류에 대한 재시도 로직을 명시적으로 통합해야 합니다. 일시적 오류에 대한 재시도 로직을 통합하는 예시를 보려면 핵심 API 예시를 참조하세요.
UnknownTransactionCommitResult
커밋 작업은 재시도 가능한 쓰기 작업 입니다. 커밋 작업에서 오류가 발생하면 MongoDB 드라이버는 retryWrites
값에 관계없이 커밋을 다시 시도합니다.
커밋 작업에서 "UnknownTransactionCommitResult"
레이블이 지정된 오류가 발생하면 커밋을 다시 시도할 수 있습니다.
콜백 API는
"UnknownTransactionCommitResult"
에 대한 재시도 로직을 통합합니다.코어 트랜잭션 API에는
"UnknownTransactionCommitResult"
에 대한 재시도 로직이 통합되어 있지 않습니다."UnknownTransactionCommitResult"
을 처리하려면 애플리케이션에 오류에 대한 재시도 로직을 명시적으로 통합해야 합니다. 알 수 없는 커밋 오류에 대한 재시도 로직을 통합한 예시를 보려면 핵심 API 예시를 참조하세요.
TransactionTooLargeForCache
버전 6.2에 추가되었습니다.
MongoDB 6.2부터 서버는 TransactionTooLargeForCache
오류를 수신하는 경우 트랜잭션을 재시도하지 않습니다. 이 오류는 캐시가 너무 작아 재시도에 실패할 가능성이 높다는 의미입니다.
transactionTooLargeForCacheThreshold
임계값의 기본값은 0.75
입니다. 트랜잭션이 캐시의 75%를 초과하여 사용하는 경우, 서버는 트랜잭션을 재시도하는 대신 TransactionTooLargeForCache
를 반환합니다.
이전 버전의 MongoDB에서는 서버가 TransactionTooLargeForCache
대신 TemporarilyUnavailable
또는 WriteConflict
를 반환합니다.
오류 임계값을 수정하려면 setParameter
명령을 사용합니다.
추가 정보
mongosh
예제
트랜잭션에 사용할 수 있는 mongosh
메서드는 다음과 같습니다.
참고
mongosh
예제에서는 단순화를 위해 재시도 로직과 강력한 오류 처리를 생략했습니다. 애플리케이션에 트랜잭션을 통합하는 보다 실용적인 예는 대신 트랜잭션 오류 처리 를 참조하세요.
// Create collections: db.getSiblingDB("mydb1").foo.insertOne( {abc: 0}, { writeConcern: { w: "majority", wtimeout: 2000 } } ) db.getSiblingDB("mydb2").bar.insertOne( {xyz: 0}, { writeConcern: { w: "majority", wtimeout: 2000 } } ) // Start a session. session = db.getMongo().startSession( { readPreference: { mode: "primary" } } ); coll1 = session.getDatabase("mydb1").foo; coll2 = session.getDatabase("mydb2").bar; // Start a transaction session.startTransaction( { readConcern: { level: "local" }, writeConcern: { w: "majority" } } ); // Operations inside the transaction try { coll1.insertOne( { abc: 1 } ); coll2.insertOne( { xyz: 999 } ); } catch (error) { // Abort transaction on error session.abortTransaction(); throw error; } // Commit the transaction using write concern set at transaction start session.commitTransaction(); session.endSession();