日記

日々のことと、Python/Django/PHP/Laravel/nodejs などソフトウェア開発のことを書き綴ります

Laravel 5.1 入門記 その13 (トランザクション編)

今回は簡単に。トランザクション制御です。

Database: Getting Started - Laravel - The PHP Framework For Web Artisans

Database Transactions

Laravel というか PHP の場合?宣言的にトランザクション制御を行う簡単な方法も無いため、Closure スタイルのトランザクション境界設定か、トランザクション開始と終了で関数を呼び出す2パターンが実装方法として用意されてます。

Transaction Closure

Closure でのトランザクション実装は以下の様な感じ。

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
});

正常に処理が成功すれば commit、失敗して例外が発生したら rollback です。 この DB::transaction を利用するときは、自動で commit / rollback が行われるので、手動での作業は不要になります。

ちなみに、DBファサードの処理は、Eloquent を使っても DB ファサードからクエリを実行しても同じで、同様にトランザクション処理が行えます。 Eloquent を使った例で、以下の様にも実装できます。

DB::transaction(function () {
    User::all()->update(['votes' => 1]);

    Post::all()->delete();
});

Manually Using Transactions

手動でトランザクションを制御したい時は、以下の様な感じ。

DB::beginTransaction();

// 何らかの処理
if (Another::processDataEntry()) {
    // 成功
    DB::commit();
} else {
    // 失敗
    DB::rollback();
}

見たままですね。

トランザクション処理は終わりで、次は Request の一歩進んだ使い方とエラーメッセージの使い方などをまとめます。