Laravelでトランザクション処理を行う

こんにちは、さるまりんです。

LaravelでDBトランザクションを使う必要があったのでその方法をメモしておきます。

どちらの方法もDBファサードを使うのでプログラムに

use Illuminate\Support\Facades\DB;

を追加します。

方法1. DBファサードのtransaction()使う

DB::transaction(function () {
    // トランザクションとして扱いたい処理をここへ
});

コード例はこんな感じです。

DB::transaction(function() use ($name, $price, $quantity) {
    // 商品を登録
    Product::create([
        'name' => $name,
        'price' => $price,
    ]);
    // 在庫を登録
    Inventory::create([
        'name' => $name,
        'quantity' => $quantity,
    ]);
});

商品と在庫の登録の両方が成功したときはトランザクションがコミットされ、それ以外はロールバックされます。

方法2. DBファサードのbeginTransaction()、commit()、rollBack()を使う

try {
    // トランザクション開始
    DB::beginTransaction();

    // insertやupdate処理

    // コミット (成功時)
    DB::commit();
} catch (Exception $e) {
    // ロールバック (失敗時)
    DB::rollBack();
}

方法1で行ったのと同じ処理はこんな感じになります。

try {
    // トランザクション開始
    DB::beginTransaction();

    // 商品を登録
    Product::create([
        'name' => $name,
        'price' => $price,
    ]);
    // 在庫を登録
    Inventory::create([
        'name' => $name,
        'quantity' => $quantity,
    ]);

    // コミット (成功時)
    DB::commit();
} catch (Exception $e) {
    // ロールバック (失敗時)
    DB::rollBack();
}

こちらも商品と在庫の登録の両方が成功したときはトランザクションがコミットされ、それ以外はロールバックされます。

方法1の方が簡潔に見えますね。ただ、ループの中で1000回に一度コミットとかするときは方法2の方が書きやすそうに思います。適材適所使っていけるよう考えていきたいと思います。

読んでくださってありがとうございました。
それではまた!