Laravelを勉強する際、トランザクションがいまいちわからなかったので調べてみました。 どんなコードを書くかというよりかはどういう仕組みなのかを中心に書いています。
もくじ
トランザクションの特徴 (ACID特性)
トランザクションは、データベースにおける一連の操作を安全に実行するための仕組みです。具体的には、複数のデータ操作(INSERT、UPDATE、DELETEなど)をまとめて「ひとまとまりの処理」として扱い、以下の条件を保証するものです。
Atomicity(原子性)
- トランザクション内のすべての処理が成功するか、失敗した場合はすべて無効化(ロールバック)されることを保証します。
例: 銀行口座間の振込処理で、送金元の口座からお金を引き出す処理と送金先の口座にお金を追加する処理はどちらか一方だけが実行されることはありません。
Consistency(一貫性)
- トランザクション前後でデータベースの整合性が保たれることを保証します。
例: 振込額がマイナスにならないようにする制約がデータベースに設定されている場合、その制約を破る操作は実行されません。
Isolation(分離性)
- 同時に実行される複数のトランザクションが互いに影響を与えないようにします。
例: 同じ商品を同時に2人が購入しようとした場合、在庫の整合性を保つための制御が行われます。
Durability(永続性)
- トランザクションが完了すると、その結果が確実に保存されることを保証します。システムがクラッシュしても、完了済みの処理は失われません。
Laravelでのトランザクションの使用例
Laravelでは、トランザクションは主にDB::transaction()
メソッドを使って実装します。
例:振込処理
use Illuminate\Support\Facades\DB; DB::transaction(function () { // 送金元の残高を減らす DB::table('accounts')->where('id', 1)->decrement('balance', 500); // 送金先の残高を増やす DB::table('accounts')->where('id', 2)->increment('balance', 500); });
(LaravelのDB::transaction()
を使うと簡潔に実装できますが、必要に応じてtry-catch
を使ったエラーハンドリングを追加することも可能。)
- トランザクションが開始される。
- 残高の更新が2つの処理として行われる。
- どちらか一方の操作でエラーが発生した場合、自動的にロールバック(データは変更前の状態に戻る)。
- すべての処理が成功すれば、自動的にコミット(データ変更が確定)。
トランザクションが必要になる場面
- 銀行口座の振込処理
- 商品購入時の在庫管理と決済
- ユーザー登録時に複数のテーブルを更新する場合
- 他のテーブルと連携する更新処理(例: 注文データと在庫データを同時に更新)
まとめ
トランザクションはデータベースの不整合を防ぎ、信頼性の高いアプリケーションを作るために不可欠な技術です。
うさぎ
おつかれえええええ!!!
ポチップ