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