Session.withTransaction()
定義
Session.withTransaction( <function> [, <options> ] )
mongosh v1.1.0の新機能
トランザクション内で指定された Lambda 関数を実行します。エラーが発生した場合、メソッドは次の処理を再試行します。
コミット操作(コミットに失敗した場合)。
トランザクション全体(エラーが許容される場合)。
Session.withTransaction()
メソッドは トランザクション オプションを受け入れます。次の値を返します。 コールバック関数によって生成された値。 重要
mongosh メソッド
このページでは、
mongosh
メソッドについて記載しています。ただし、データベースコマンドや Node.js などの言語固有のドライバーのドキュメントには該当しません。データベースコマンドについては、
commitTransaction
コマンドを参照してください。MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の 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
のトランザクションを試す場合は、「実行時間制限 」を参照してください。