Session.withTransaction()
定義
Session.withTransaction( <function> [, <options> ] )
mongosh v1.1.0の新機能
トランザクション内で指定された Lambda 関数を実行します。エラーが発生した場合、メソッドは次の処理を再試行します。
コミット操作(コミットに失敗した場合)。
トランザクション全体(エラーが許容される場合)。
重要
mongosh メソッド
このページでは、
mongosh
メソッドについて説明します。ただし、データベースコマンドや Node.js などの言語固有のドライバーのドキュメントには該当しません。データベースコマンドについては、
commitTransaction
コマンドを参照してください。MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。
動作
Node.js ドライバーには、 Callback APIと呼ばれるバージョンの Session.withTransaction()
があります。 Callback API
はコールバックも受け入れますが、Node.js メソッドの戻り値の型は Promise である必要があります。 mongosh
Session.withTransaction()
メソッドには Promise は必要ありません。
例
次の例では、 balances
コレクションを作成し、トランザクションを使用して 2 人の顧客間での送金を処理します。
balances
コレクションを次のように作成します。
use accounts db.balances.insertMany( [ { customer: "Pat", balance: Decimal128( "35.88" ) }, { customer: "Sasha", balance: Decimal128( "5.23" ) } ] )
トランザクションで使用されるいくつかの変数を初期化します。
var fromAccount = "Pat" var toAccount = "Sasha" var transferAmount = 1 var dbName = "accounts" var collectionName = "balances"
セッションを開始し、トランザクションを実行してアカウントを更新します。
var session = db.getMongo().startSession( { readPreference: { mode: "primary" } } ); session.withTransaction( async() => { const sessionCollection = session.getDatabase(dbName).getCollection(collectionName); // Check needed values var checkFromAccount = sessionCollection.findOne( { "customer": fromAccount, "balance": { $gte: transferAmount } } ) if( checkFromAccount === null ){ throw new Error( "Problem with sender account" ) } var checkToAccount = sessionCollection.findOne( { "customer": toAccount } ) if( checkToAccount === null ){ throw new Error( "Problem with receiver account" ) } // Transfer the funds sessionCollection.updateOne( { "customer": toAccount }, { $inc: { "balance": transferAmount } } ) sessionCollection.updateOne( { "customer": fromAccount }, { $inc: { "balance": -1 * transferAmount } } ) } )
Lambda 関数には、balances
コレクションを更新する前に操作を検証するための初期チェック機能があります。
MongoDB ではトランザクションが自動的に完了します。
両方の
updateOne()
操作が成功した場合、コールバックが返されたときにSession.withTransaction()
トランザクションをコミットします。コールバック内で例外が発生した場合、
Session.withTransaction()
はトランザクションを終了し、コミットされていない変更をロールバックします。
注意
デフォルトでは、MongoDB は60秒を超えて実行されるトランザクションを終了します。 デフォルトのタイムアウトを延長してmongosh
のトランザクションを試す場合は、「実行時間制限 」を参照してください。