🦁

Laravel トランザクションを手動で設置

2022/03/23に公開

はじめに

laravelにて、大量のデータをDBに保存する処理にて、トランザクション処理を用いました。
Laravelでの記述をメモ用に記載します。

トランザクション処理とは

処理の一連の流れです。(ざっくり
ex.)データベースに100件のデータを入力する場合、途中までうまく行っていたけど、何かか原因で50件までの処理しかできなかった。処理が完了できた50件については、データベースに保存しておこう、とするのは怖いですよね。
ex.)郵便屋さんが100個の荷物をある家に配達する場合、50個しか運べなかったから、50個だけ置いておきます。とはいきませんよね。100個であれば、100個届いてほしいものです。クレームものです。

Laravelでのトランザクション記述方法

一連の操作をデータベーストランザクション内で実行するには、DBファサードのtransactionメソッドを使用してください。トランザクション「クロージャ」の中で例外が投げられると、トランザクションは自動的にロールバックされます。「クロージャ」が正しく実行されると、自動的にコミットされます。transactionメソッドを使用すれば、ロールバックやコミットを自分でコードする必要はありません。
Laravel公式

例文

店舗のデータを取得するような処理において、下記のような記述をします。

    function testTransaction($shop_id)
    {
        \DB::beginTransaction();

        $shops = Shop::where($shop_id)
          ->get();

        if (!$shops) {
            \Log::critical('店舗が存在しません',
                ['shop_id' => $shop_id]
            );
            \DB::rollback();

            return false;
        }

        \DB::commit();

        $this->info("shop_id:${shop_id}, 店舗を取得できました。");
    }

\DB::beginTransaction();

トランザクション処理の開始

\DB::rollback();

トランザクション処理で不具合があれば全部なかったことにする

\DB::commit();

トランザクション処理が全てうまく行ったので、この処理を完遂する

さいごに

トランザクション処理には、DBファザードのtransactionメソッドもあるようです。
ただ、ご自身で分岐をしたりする場合は、こちらの方が記述しやすいかもしれません。
DBファサードも是非調べてみてください。

Discussion