🦁
Laravel トランザクションを手動で設置
はじめに
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