トランザクションの実行
Overview
このガイドでは、 MongoDB PHPライブラリを使用してトランザクションを実行する方法を学習できます。 トランザクションを使用すると、トランザクション全体がコミットされた場合にのみ、データを変更する一連の操作を実行できます。 トランザクション内のいずれかの操作が成功しない場合、ライブラリはトランザクションを停止し、変更が反映される前にすべてのデータ変更を破棄します。 この特徴はアトミック性と 呼ばれます。
MongoDB では、トランザクションは論理セッション内で実行されます。 セッションは 、順番に実行されるよう関連付けられた読み取り操作または書き込み操作のグループです。 セッションにより、一連の操作に対する 因果整合性 が有効になり、 ACID 準拠のトランザクション(アトミック性、整合性、分離、耐久性の期待を満たすトランザクション)内で操作を実行できるようになります。 MongoDBは、トランザクション操作で予期せぬエラーが発生した場合でも、その操作に関わるデータの一貫性が保たれることを保証します。
MongoDB PHPライブラリを使用すると、 MongoDB\Client
インスタンスから新しいセッションを作成できます。 その後、結果のMongoDB\Driver\Session
インスタンスを使用してトランザクションを実行できます。
警告
Session
は、それを作成したClient
で実行されている操作でのみ使用します。 Session
と別のClient
を使用すると、操作エラーが発生します。
トランザクション API
このセクションでは、 MongoDB PHPライブラリが提供するトランザクション API について学習できます。 トランザクションを開始する前に、 Client
インスタンスでMongoDB\Client::startSession()
メソッドを使用してSession
を作成する必要があります。 その後、次のいずれかの API を使用してトランザクションを実行できます。
Convenient API
MongoDB PHPライブラリは、トランザクションのライフサイクルを管理するためのConvenient Transaction APIを提供します。 このAPIを実装するには、 MongoDB\with_transaction()
関数を使用してトランザクション内でカスタムコールバックを実行します。 with_transaction()
関数は、次のタスクを実行します。
トランザクションを開始する
操作が を返した場合など、トランザクションを終了するか再試行することでエラーを処理します
TransientTransactionError
トランザクションをコミットする
このガイドの「トランザクションの例」セクションでは、このAPIを使用してトランザクションを実行する方法を示します。
Core API
あるいは、 Session
クラスが提供するメソッドを使用して、トランザクション ライフサイクルをより制御できます。 次の表では、これらの方法について説明します。
方式 | 説明 |
---|---|
| Starts a new transaction on this session. The session
must be passed into each operation within the transaction, or
the operation will run outside of the transaction. You can set transaction options by passing an options parameter. |
| Commits the active transaction for this session. This method returns an
error if there is no active transaction for the session, the
transaction was previously ended, or if there is a write conflict. |
| Ends the active transaction for this session. This method returns an
error if there is no active transaction for the session or if the
transaction was committed or ended. |
トランザクションの例
この例では、金融トランザクションのためにbank
データベースのコレクション内のデータを変更するコールバック関数を定義します。 このコードは、次のアクションを実行します。
ターゲット コレクションにアクセスするための
Collection
インスタンスを作成します。アカウント間で転送されるアカウント番号と金額を指定します。
コールバック関数を定義します。この関数は、
Session
インスタンスをパラメータとして受け取ります。送金を反映するようにカスタマーの残高を更新します。
トランザクションの受信をタイムスタンプとともに記録します。
トランザクションが正常にコミットされた場合は、メッセージを出力します。
$receipts = $client->bank->receipts; $checking = $client->bank->checking_accounts; $saving = $client->bank->saving_accounts; $accountId = "5678"; $transferAmount = 1000.0; $callback = function (MongoDB\Driver\Session $session) use ( $checking, $saving, $receipts, $accountId, $transferAmount ): void { $checking->updateOne( ["account_id" => $accountId], ['$inc' => ["balance" => -$transferAmount]], ["session" => $session] ); $saving->updateOne( ["account_id" => $accountId], ['$inc' => ["balance" => $transferAmount]], ["session" => $session] ); $summary = sprintf('SAVINGS +%1$u CHECKING -%1$u', $transferAmount); $receipts->insertOne( [ "account_id" => $accountId, "summary" => $summary, "timestamp" => new MongoDB\BSON\UTCDateTime(), ], ["session" => $session] ); echo "Successfully performed transaction!", PHP_EOL; echo "Summary: ", $summary, PHP_EOL; };
次に、次のコードを実行してトランザクションを実行します。 このコードは、次のアクションを完了します。
startSession()
メソッドを使用してクライアントからセッションを作成します。セッションとコールバックをパラメータとして渡して、トランザクションを管理するために
with_transaction()
関数を呼び出します。
$session = $client->startSession(); try { MongoDB\with_transaction($session, $callback); } catch (MongoDB\Driver\Exception\RuntimeException $e) { echo "Caught exception: ", $e->getMessage(), PHP_EOL; }
Successfully performed transaction! Summary: SAVINGS +1000 CHECKING -1000
詳細情報
このガイドで言及されている概念の詳細については、 MongoDB Serverマニュアルの次のページ を参照してください。
ACID compliance の詳細については、 「 データベース管理システムの ACID プロパティとは 」を参照してください。 MongoDB Webサイトの記事。
挿入操作の詳細については、 ドキュメントの挿入ガイドをご覧ください。
API ドキュメント
このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。
Session
クラスとメソッドの詳細については、次のPHP拡張APIドキュメントを参照してください。