logo
Home
About
Works
Blog
Contact

Laravelでトランザクション処理のエラーハンドリングを行う方法

2022-03-29

2022-03-29

4 min read

Laravel

目次


  1. トランザクションとは
  2. Laravelでトランザクション処理を行う方法
  3. まとめ

トランザクションとは

まずトランザクション処理とは、複数のデータ更新を行う際に、データの整合性を保証するための処理です。 システム開発において、トランザクション処理は頻繁に出てくる処理だと思います。

LaravelではDBファサードが提供するメソッドを使用することで、簡単に実装することができます。

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

Laravelでトランザクションを行う方法は、以下の2つのパターンがあります。

  • DBファサードが提供するtransactionメソッドを使用する方法
  • DBファサードが提供するbeginTransactionメソッドを使用する方法

beginTransactionメソッドを用いた場合は、トランザクションの開始やロールバックやコミットいった動きを自分で制御する必要があります。

今回はtransactionメソッドを使用する方法で、エラーハンドリングの処理を記述します。

transactionメソッド

以下transactionメソッドを用いた簡単な例です。

transactionメソッドを用いたトランザクションの例
try{
    $user = DB::transaction(function () use () {
        // =====================
        // 登録や更新などの複数の処理
        // =====================

        // エラーにしたいは例外を投げる
        if($someCondition) throw new Exception('1000');

        // 戻り値にユーザーを返す
        $result = User::first();
        return $result;
    });
    return response()->json(['data' => $user], 200);

} catch(Throwable $e){
    // 例外で投げられたメッセージを受け取って返す
    $error_code = $e->getMessage();
    $error_message = $error_code === '1000' ? '登録更新処理に失敗しました。' : '不明なエラーです。';
    return response()->json(['error' => $error_message], 500);
}

正常に処理を終えた場合は、transactionメソッドの戻り値で受け取ったuserの内容を返しています。

トランザクション処理の中で例外が起きた時は、例外を捕まえてエラーを返しています。

この時自分で投げた例外に関しては、「登録更新処理に失敗しました。」のようなメッセージにしています。

beginTransactionメソッド

ちなみにbeginTransactionメソッドを用いたトランザクションでは、以下のようにトランザクションやそれに伴うロールバックとコミットといった処理を自分で制御する必要があります。

beginTransactionメソッドを用いたトランザクション例
// トランザクションの開始
DB::beginTransaction();
try {
    // =====================
    // 登録や更新などの複数の処理
    // =====================

    // トランザクションをコミット
    DB::commit();
} catch(Exception $exception) {
    // トランザクションをロールバック
    DB::rollBack();
}

※エラーハンドリングについては触れていません。

まとめ

自分は普段transactionメソッドを用いた実装を使用しています。エラーハンドリングについて、見た感じ公式ドキュメントには記載されていなかったので今回自分なりの方法を簡単にまとめてみました。

実際はレスポンスを返す部分などは、整理した方がいいと思うのでお気をつけください!