Blogブログ

Laravelのトランザクションとエラーハンドリグについて

こんにちは、HLCのエンジニアの砂町です。
今回はLaravelでのトランザクション処理と、エラーハンドリングについてお話ししようと思います。

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

まずトランザクション処理とは、複数のデータの更新などを行う際に、データの整合性を保つために行うものです。

簡単に説明してみます。

userテーブルとpostテーブルが1:nの関係であるとします。
userのデータを削除したときに、合わせてpostのデータも削除したいとします。
userのデータ削除に成功して、postのデータ削除に失敗した場合、ここで意図しないデータのずれが起こります。

上記のようなことが起きたときにトランザクション処理を挟んでいると、userのデータを削除前の状態で保つことができるため、データがずれをなくすことができます。

Laravelでのトランザクション処理

Laravelでトランザクション処理を行う方法として、「transactionメソッド」を使う方法と「beginTransactionメソッド」を使う方法があります。
今回は、transactionメソッドを用いた方法でご説明します。
以下transactionメソッドを用いた例になります。


    $user = DB::transaction(function () use () {
        // =====================
        // 登録や更新などの複数の処理
        // =====================

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


上記の例のように、transactionメソッドで囲った中の処理がトランザクション処理となります。
またtransactionメソッドでは、returnした値を戻り値として受け取ることができます。
上記では、正常に処理を終えた時はuserのデータを返しています。

エラーハンドリングについて

エラーハンドリングとして今回行いたいことは、例外を捕まえて「処理に失敗しました。」などのエラーを返すことです。
以下エラーハンドリングの例となります。


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);
}

上記の例のように、try catchを用いることで例外を捕まえることができます。
あとは適当なエラーを返したら終わりです。

まとめ

トランザクション処理はシステム開発において、よくでてくる内容だと思います。
Laravelではtransactionメソッドを用いると簡単に実装できるので楽ちんですね。
ちなみに今回は名前しか触れていませんが、「beginTransactionメソッド」を用いるとトランザクションにおけるロールバックやコミットといった処理を制御することが可能です。
興味がある方は調べてみてください!

砂町

執筆者

Developer

砂町