Callback API と Core API
トランザクションを開始し、指定された操作を実行し、コミット(エラーの場合は中止)します。
トランザクションを開始し、トランザクションをコミットするには、明示的な呼び出しが必要です。
TransientTransactionErrorおよびUnknownTransactionCommitResultのエラー処理ロジックを組み込まず、代わりにこれらのエラーに対するカスタム エラー処理を組み込む柔軟性を提供します。
Callback API
Callback API には次のロジックが組み込まれています。
トランザクションで
TransientTransactionErrorエラーが発生した場合にトランザクション全体を再試行する方法。コミットで
UnknownTransactionCommitResultエラーが発生した場合にコミット操作を再試行する方法
MongoDB 6.2以降、サーバーはTransactionTooLargeForCacheエラーを受信してもトランザクションを再試行しません。
例
Core API
Core transaction API には、次のラベルの付いたエラーの再試行ロジックは組み込まれていません。
TransientTransactionError。 トランザクション内の操作によってTransientTransactionErrorというラベルの付いたエラーが返された場合は、トランザクション全体を再試行できます。TransientTransactionErrorを処理するには、アプリケーションはエラーの再試行ロジックを明示的に組み込む必要があります。UnknownTransactionCommitResult。 コミットがUnknownTransactionCommitResultというラベルの付いたエラーを返す場合は、コミットを再試行できます。UnknownTransactionCommitResultを処理するには、アプリケーションはエラーの再試行ロジックを明示的に組み込む必要があります。
例
次の例には、一時的なエラーの場合はトランザクションを再試行し、不明なコミット エラーの場合はコミットを再試行するロジックが組み込まれています。
ドライバーのバージョン
トランザクションエラーの処理
MongoDB かリレーショナル データベースかにかかわらず、データベース システムに関係なく、トランザクションのコミット中にエラーを処理し、トランザクションの再試行ロジックを組み込む必要があります。
TransientTransactionError
トランザクション内の個々の書き込み操作は、retryWrites の値に関係なく、再試行できません。プライマリが降格する場合など、ラベル "TransientTransactionError"に関連付けられたエラーが操作で発生した場合は、トランザクション全体が再試行できます。
Callback API には
"TransientTransactionError"の再試行ロジックが組み込まれています。Core transaction API には
"TransientTransactionError"の再試行ロジックは組み込まれていません。"TransientTransactionError"を処理するには、アプリケーションはエラーの再試行ロジックを明示的に組み込む必要があります。 一時的なエラーの再試行ロジックを組み込んだ例については、「 Core API の例 」を参照してください。
UnknownTransactionCommitResult
コミット操作は、再試行可能な書込み操作です。 コミット操作でエラーが発生した場合、MongoDB ドライバーはretryWritesの値に関係なくコミットを再試行します。
コミット操作で"UnknownTransactionCommitResult"というラベルの付いたエラーが発生した場合は、コミットを再試行できます。
Callback API には
"UnknownTransactionCommitResult"の再試行ロジックが組み込まれています。Core transaction API には
"UnknownTransactionCommitResult"の再試行ロジックは組み込まれていません。"UnknownTransactionCommitResult"を処理するには、アプリケーションはエラーの再試行ロジックを明示的に組み込む必要があります。 不明なコミット エラーの再試行ロジックを組み込んだ例については、「 Core API の例 」を参照してください。
TransactionTooLargeForCache
バージョン6.2の新機能。
MongoDB 6.2 以降、サーバーはTransactionTooLargeForCacheエラーを受信してもトランザクションを再試行しません。 このエラーは、キャッシュが小さすぎて再試行が失敗する可能性があることを意味します。
transactionTooLargeForCacheThresholdしきい値のデフォルト値は0.75です。 トランザクションがキャッシュの 75% 以上を使用している場合、サーバーはトランザクションを再試行する代わりにTransactionTooLargeForCacheを返します。
MongoDB の以前のバージョンでは、サーバーは ではなくTemporarilyUnavailable WriteConflictまたはTransactionTooLargeForCache を返します。
エラーしきい値を変更するには、 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();