문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/

드라이버 API

이 페이지의 내용

  • 콜백 API와 코어 API
  • 콜백 API
  • 핵심 API
  • 드라이버 버전
  • 트랜잭션 오류 처리
  • 추가 정보

Callback API:

핵심 API:

  • 트랜잭션을 시작하고 커밋하려면 명시적인 호출이 필요합니다.

  • TransientTransactionErrorUnknownTransactionCommitResult 에 대한 오류 처리 로직을 통합하지 않고 대신 이러한 오류에 대한 사용자 지정 오류 처리를 통합할 수 있는 유연성을 제공합니다.

콜백 API는 로직을 통합합니다.

MongoDB 6 부터 시작.2, 서버는 TransactionTooLargeForCache 오류를 수신하면 트랜잭션을 재시도하지 않습니다.


➤ 오른쪽 상단의 언어 선택 드롭다운 메뉴를 사용하여 이 페이지에 있는 예제의 언어를 설정하세요.


코어 트랜잭션 API에는 다음과 같은 레이블이 지정된 오류에 대한 재시도 로직이 포함되어 있지 않습니다.


➤ 오른쪽 상단의 언어 선택 드롭다운 메뉴를 사용하여 이 페이지에 있는 예제의 언어를 설정하세요.


다음 예제에는 일시적인 오류에 대해 트랜잭션을 다시 시도하고 알 수 없는 커밋 오류에 대해 커밋을 다시 시도하는 로직이 포함되어 있습니다.

데이터베이스 시스템(MongoDB 또는 관계형 데이터베이스)에 관계없이 애플리케이션은 트랜잭션 커밋 중 오류를 처리하고 트랜잭션에 대한 재시도 로직을 통합하는 조치를 취해야 합니다.

트랜잭션 내부의 개별 쓰기 작업은 값에 관계없이 재시도할 수 없습니다. 작업 에서 retryWrites 레이블과 관련된 오류가 발생하는 경우 "TransientTransactionError", 예를 들어 프라이머리가 강등된 경우 트랜잭션 전체를 다시 시도할 수 있습니다.

  • 콜백 API는 "TransientTransactionError"에 대한 재시도 로직을 통합합니다.

  • 코어 트랜잭션 API에는 "TransientTransactionError" 에 대한 재시도 로직이 통합되어 있지 않습니다. "TransientTransactionError" 을 처리하려면 애플리케이션에 오류에 대한 재시도 로직을 명시적으로 통합해야 합니다. 일시적 오류에 대한 재시도 로직을 통합하는 예시를 보려면 핵심 API 예시를 참조하세요.

커밋 작업은 재시도 가능한 쓰기 작업 입니다. 커밋 작업에서 오류가 발생하면 MongoDB 드라이버는 retryWrites 값에 관계없이 커밋을 다시 시도합니다.

커밋 작업에서 "UnknownTransactionCommitResult" 레이블이 지정된 오류가 발생하면 커밋을 다시 시도할 수 있습니다.

  • 콜백 API는 "UnknownTransactionCommitResult"에 대한 재시도 로직을 통합합니다.

  • 코어 트랜잭션 API에는 "UnknownTransactionCommitResult" 에 대한 재시도 로직이 통합되어 있지 않습니다. "UnknownTransactionCommitResult" 을 처리하려면 애플리케이션에 오류에 대한 재시도 로직을 명시적으로 통합해야 합니다. 알 수 없는 커밋 오류에 대한 재시도 로직을 통합한 예시를 보려면 핵심 API 예시를 참조하세요.

버전 6.2에 추가되었습니다.

MongoDB 6.2부터 서버는 TransactionTooLargeForCache 오류를 수신하는 경우 트랜잭션을 재시도하지 않습니다. 이 오류는 캐시가 너무 작아 재시도에 실패할 가능성이 높다는 의미입니다.

transactionTooLargeForCacheThreshold 임계값의 기본값은 0.75입니다. 트랜잭션이 캐시의 75%를 초과하여 사용하는 경우, 서버는 트랜잭션을 재시도하는 대신 TransactionTooLargeForCache를 반환합니다.

이전 버전의 MongoDB에서는 서버가 TransactionTooLargeForCache 대신 TemporarilyUnavailable 또는 WriteConflict를 반환합니다.

오류 임계값을 수정하려면 setParameter 명령을 사용합니다.

트랜잭션에 사용할 수 있는 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();
← 트랜잭션