トランザクション

最終更新日: 2023年6月19日

[例] 注文時に商品の在庫を減じる

モデル

2つのモデル「商品」と「注文」を用意します。

商品モデルと注文モデル

商品モデルに「在庫」項目を用意します。

商品モデル

注文モデルに「数量」項目を用意します。

注文モデル

ここで注文データを1件作成したとき、数量に記載した値を商品の在庫から減じるという業務処理を実現します。注文データの新規作成と、商品データの更新をひとまとめとして扱います。このように、複数のモデル操作をひとまとめに扱うことを「トランザクション」と呼びます。

ワンポイント

トランザクションでは、データベースの更新は「両方とも成功するか」「両方とも失敗して、なかったことにするか」のいずれかになります。「片方だけ成功して、片方は失敗する」ということは生じません。

スクリプト

注文モデルの新規登録というタイミングでスクリプトを設定します。

※ 更新タイミングでも同様に設定する必要がありますが、ここでは説明を割愛します。

最初に、完成イメージを示します。商品在庫が不足していた場合はトランザクションを失敗させています。つまり在庫不足の場合は注文の新規登録処理は必ず失敗するようになっています。

※ 注文処理の登録は成功したが、在庫を減らす処理は失敗した、ということは生じない、という意味です。
在庫不足を判定するスクリプト

モデルを操作するブロック(取得、更新など)の説明は「モデルの操作」をお読みください。

実行

実行例を示します。注文モデル新規登録で、指定した数量が商品在庫を超えた場合、エラーメッセージが表示され、処理が中断されます。なお商品在庫の範囲内であれば注文は成功し、商品の在庫は正しく減じられます。

注文処理の失敗例

成功時のみ呼ばれるスクリプトとの関係

成功時のみ呼ばれるスクリプトは、トランザクションが成功したときのみ呼び出されます。トランザクション失敗時は呼び出されません。