皆さんは自分のプロジェクトでDBのトランザクションを実装されているでしょうか?
案件で色んなクライアント先のプログラムを見ていると、結構全く実装されていないプロジェクトもあったりする。
DB Transactionとは簡単に言うとDBとの接続・操作の途中で何か問題があった場合、途中まで処理した分をロールバック(元に戻す)してくれる仕組みのこと。
例えば以下のようにデータをいったん全件削除してから、新たなデータを登録するような仕組みがあった場合、
public function update($data) { $this->sampleService->delete(); $this->sampleService->create($data); }
このままだとデータを登録している途中で何かエラーで処理が中断されてしまった場合、削除されたデータは元に戻らず、新しいデータも中途半端に登録された状態になってしまう。
これを以下のようにDB Transactionでくくると、途中でエラーが発生した場合、データを処理を開始する前の状態まで自動でロールバックしてくれる。
public function update($data) { DB::transaction(function () use ($data) { $this->sampleService->delete(); $this->sampleService->create($data); } }
確かに挿入データのバリデーションをしっかりと行ってエラーが起こらない仕組みにすることは大前提だし、実際にエラーが発生することはほとんどないとしても、処理中にDBサーバーが落ちてしまったり、ネットワークが途切れてしまったりする可能性は0にはできないワケで、扱うデータが重要であればあるほど、こういった仕組みをしっかりと設計に組み込むことは重要になる。