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

トランザクション

このガイドでは、Lambda MongoDB を使用して MongoDB でトランザクションを実行する方法を学習できます。 トランザクション を使用すると、トランザクションがコミットされた後にのみデータを更新する一連の書込み操作を実行できます。

トランザクションが失敗した場合、Larevel 統合のMongoDB操作を管理するMongoDB PHPライブラリは、変更が反映される前にMongoDB がトランザクション内で行われたすべての変更を破棄するようにします。トランザクション内のすべての変更が適用または破棄されるようにするトランザクションのこのプロパティは アトミック性と 呼ばれます。

MongoDB は、単一のドキュメントに対して書込み操作を不可分的に実行します。 複数のドキュメントに対する書込み操作のアトミック性や操作に複数のドキュメントにまたがるデータの一貫性が必要な場合は、マルチドキュメントトランザクションで実行します。

MongoDB は、ドライバーで予期せぬエラーが発生した場合でも、トランザクション操作のデータが一貫して保たれることを保証しているため、マルチドキュメントトランザクションはACID に準拠しています。

To learn more about transactions in MongoDB, see Transactions in the Server manual.

このガイドには、次のセクションが含まれています。

Tip

トランザクション ラーニング バイト

Lambda 統合を使用してトランザクションを実行するプラクティスは、 Lambda トランザクション ラーニング バイト で実行されます。

MongoDB でトランザクションを実行するには、次の MongoDB バージョンとトポロジーを使用する必要があります。

  • MongoDB バージョン4.0以降

  • レプリカセットの配置またはシャーディングされたクラスター

MongoDB Server と Lambda 統合には次の制限があります。

  • In MongoDB versions 4.2 and earlier, write operations performed within a transaction must be on existing collections. In MongoDB versions 4.4 and later, the server automatically creates collections as necessary when you perform write operations in a transaction. To learn more about this limitation, see Create Collections and Indexes in a Transaction in the Server manual.

  • MongoDB does not support nested transactions. If you attempt to start a transaction within another one, the extension raises a RuntimeException. To learn more about this limitation, see Transactions and Sessions in the Server manual.

  • Lambda MongoDB はデータベース テストの特権Illuminate\Foundation\Testing\DatabaseTransactionsとIlluminate\Foundation\Testing\RefreshDatabaseをサポートしていません。 回避策として、 Illuminate\Foundation\Testing\DatabaseMigrations特権を持つ移行を作成し、テストごとにデータベースをリセットします。

  • Lambda MongoDB は、単一のトランザクション内での並列操作の実行中をサポートしていません。

このセクションでは、コールバックでトランザクションを実行する方法を示します。

この方法でトランザクションを実行する場合、コールバック メソッド内のすべてのコードが 1 つのトランザクションとして実行されます。

次の例では、トランザクションは、 Accountモデルで表されるデータベースアカウントから別のアカウントに金額を転送する書込み操作で構成されています。

DB::transaction(function () {
$transferAmount = 200;
$sender = Account::where('number', 223344)->first();
$sender->balance -= $transferAmount;
$sender->save();
$receiver = Account::where('number', 776655)->first();
$receiver->balance += $transferAmount;
$receiver->save();
});

オプションで、次のコード例に示すように、2 番目のパラメーターとして、失敗したトランザクションを再試行するための最大回数を渡すことができます。

DB::transaction(function() {
// transaction code
},
attempts: 5,
);

このセクションでは、トランザクションを開始してコミットする方法を説明します。

この方法でトランザクションを開始し、コミットするには、 DB::beginTransaction()メソッドを呼び出してトランザクションを開始します。 次に、 DB::commit()メソッドを呼び出してトランザクションを終了します。これにより、トランザクション内で実行されたすべての更新が適用されます。

次の例では、1 番目のアカウントの残高が 2 番目のアカウントに移動され、その後、最初のアカウントが削除されています。

DB::beginTransaction();
$oldAccount = Account::where('number', 223344)->first();
$newAccount = Account::where('number', 776655)->first();
$newAccount->balance += $oldAccount->balance;
$newAccount->save();
$oldAccount->delete();
DB::commit();

このセクションでは、トランザクションをロールバックする方法を説明します。 ロールバックは、そのトランザクション内で実行されたすべての書込み (write) 操作を元に戻します。 これは、データがトランザクション前の状態に戻ることを意味します。

ロールバックを実行するには、トランザクションがコミットされる前にいつでもDB::rollback()関数を呼び出します。

次の例では、トランザクションは、 Accountモデルで表される 1 つのアカウントから複数の他のアカウントに金額を転送する書込み操作で構成されています。 送信者アカウントの残高が不足している場合、トランザクションはロールバックされ、モデルは更新されません。

DB::beginTransaction();
$sender = Account::where('number', 223344)->first();
$receiverA = Account::where('number', 776655)->first();
$receiverB = Account::where('number', 990011)->first();
$amountA = 100;
$amountB = 200;
$sender->balance -= $amountA;
$receiverA->balance += $amountA;
$sender->balance -= $amountB;
$receiverB->balance += $amountB;
if ($sender->balance < 0) {
// insufficient balance, roll back the transaction
DB::rollback();
} else {
DB::commit();
}