##はじめに
データを登録や更新処理する時にトランザクションを用いていますか。
トランザクション処理を入れていない場合、データの登録や更新処理に失敗した場合も成功した一部分だけ処理されて期待に反した処理が行われることがあります。
簡単に言うと銀行のATMに1万円預けるといったことをする時、「ATMに1万円を入れる」と「機械が1万円を読み込んで記帳する」といった処理があると思います。
「ATMに1万円を入れる」の処理は成功「機械が1万円を読み込んで記帳する」は失敗した場合その1万円はどこかに消えてしまいますね。
そうならないために、ここからここまでが一連の登録や更新処理であると言うのを示すのに用いるのがtransaction(トランザクション)
です。
【Laravelのトランザクション】
クロージャーの中の処理で例外が発生すると自動でロールバックされクロージャーの中で返した値がtransactionメソッドの返り値にできる
##transactionメソッドを実装する
Laravelでトランザクション処理を行う方法は2つあります。
①DBファザードのtransactionメソッドを利用する
②手動のトランザクション(DBファザードのbeginTransaction, rollBack, commit を利用する)
基本は①DBファザードのtransactionメソッドを利用するで問題ないですが、トランザクションを手動で開始しロールバックとコミットをコントロールしたい場合は、DBファサードのbeginTransactionメソッドを使います。
###DBファザードのtransactionメソッドを利用した実装
DBファザードのtransactionメソッドにクロージャーを渡し、その中でDBの更新処理を行います。
DB::transaction(function () {
// 更新処理
});
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
public function update (Request $request)
{
$user = User::find($request->id);
return DB::transaction(function () use ($user, $request) {
$user->fill($request->all();)->save();
return $user;
});
}
###手動のトランザクション(DBファザードのbeginTransaction, rollBack, commit を利用する)
try,catchを用いて更新処理を行います。
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
public function update (Request $request)
{
$user = User::find($request->id);
DB::beginTransaction();
try {
$user->fill($request->all();)->save();
DB::commit();
} catch (\Exception $e) {
DB::rollback();
}
return $user;
}
##おわりに
いかがでしたでしょうか。
データを扱う際には期待通りに動いているか慎重に確認しながら実装しましょう。