【Laravel】DB Transactionの実装について

皆さんは自分のプロジェクトで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にはできないワケで、扱うデータが重要であればあるほど、こういった仕組みをしっかりと設計に組み込むことは重要になる。