あじちゃんのブログ。備忘録。

〜SEもOLなんですかね?

transaction処理中の動きで変数が更新されず嵌った.(解決済み)

これ、try-catch中の変数の変化を取得できてないのかな?と思い検証.

{{-- blade --}}

@if(session('message'))
    <ul class="list-group">
        <li class="list-group-item list-group-item-success">{{ session('message') }}</li>
    </ul>
@endif
//controller

//成功チェック
$success = false;

try
{
    DB::transaction(function () use ($success) {
        //登録処理
        DB::insert($data);
        $success = true;
    });
}
catch(Exception $e)
{
    $success = false;
}

//成功メッセージの表示
if($success)
{
    return redirect('cbt/user')
    ->with('message', '成功しました'); //ここが出力されない
}
else//TODO
{
    return redirect('cbt/user')
    ->with('message', '予期せぬ状態'); //ここが出力される
}


間違っていた箇所はフラグの変更位置.

 DB::transaction(function () {
        //登録処理
        DB::insert($data);
    });
    
    $success = true; //transaction外でフラグを変更.


どうやら、transaction内部ではDBでの処理が完了し次第、スコープの外に出てしまうようです.
以下のような処理にしても、returnしてくれなかった.

 DB::transaction(function () {
        //登録処理
        DB::insert($data);
        
        return redirect('cbt/user')
        ->with('message', 'これはtransaction内からのredirectです');
    });


まとめ

transactionメソッド中では、DB接続が終了し次第 exit 状態となるため、DB処理の後ろで何かやっても無意味!!!