Docs Menu
Docs Home
/
MongoDBマニュアル
/ / / /

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

戻る

Session.startTransaction()