Laravel は PHP のフレームワークでコンソール上のコマンドを簡易に作成するための仕組みも備えています。コンソールコマンドを作る仕組みは Artisan といい、Laravel 組み込みのコマンドもこの Artisan でつくられています。
Artisanコンソール 6.x Laravel
Artisan を介してデータベースを操作する時、複数の SQL を実行する重い一つの手続き処理を行うことが少なくないです。作る量が少ないならば都度トランザクション処理を入れることはそれ程、苦ではないのですがせっかくなので全く書かずに済ませたくもなります。
これは次でできます。
// app/Console/Kernel.php public function handle($input, $output = null) { // DB ファサードを使うために初期化処理をあらかじめ実行(二重実行対策は親の Kernel クラスでされています) $this->bootstrap(); // トランザクションを始めます \DB::beginTransaction(); // 親 handle メソッドからは終了コードが返ってきます。 // 各 Artisan コマンド内の例外は親の handle メソッド内で全てキャッチされています。 $ret = parent::handle($input, $output); if($ret !== 0){ // 正常終了コードならコミット \DB::commit(); }else{ // 異常終了コードならロールバック \DB::rollBack(); } }
Artisan を司る Kernel クラス内で各 Artisan コマンド実行前後をトランザクション処理で括ります。
これで自動でトランザクションがかかるのですが MySQL でマイグレーションをする時には注意が要ります。MySQL においてはテーブルの作成などデータ定義をどうこうする処理はトランザクションのロールバックで巻き戻せません。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.3.2 ロールバックできないステートメント
MySQL :: MySQL 8.0 Reference Manual :: 13.3.2 Statements That Cannot Be Rolled Back
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.3.3 暗黙的なコミットを発生させるステートメント
MySQL :: MySQL 8.0 Reference Manual :: 13.3.3 Statements That Cause an Implicit Commit
このトランザクションの挙動は使用しているデータベースのシステム次第で割と変わるようなので(PostgreSQL なんかはテーブルの作成削除も巻き戻せるとかなんとか)マイグレーションに失敗時の巻き戻しをつける際はそのあたりの知見も必要そうです。