AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

Session.withTransaction() (mongosh method)

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 のトランザクションを試す場合は、「 実行時間制限 」を参照してください。

このページを評価