トランザクションという言葉。何度か聞いたことがあり、その度に調べては忘れることを何度か繰り返したので、初心者ながら一度簡単に調べてまとめてみる。
トランザクションとは
複数の SQL によるデータベースに対する処理を1つの処理としてまとめてデータベースに反映させること。
必要な場面
複数の処理を連続して行う際、すべての処理が成功したときにのみデータベースへの変更を有効にしなければならない場合。
→ 一部の処理が正しく実行されなかった場合には、すべての処理をキャンセルして取り消す(ロールバックする)ことが可能。
よくある簡単な例 「銀行の入出金システム」
例:【Aさんの口座から100万円をBさんの口座に移動させる処理】
●必要な処理は以下の2つ
1. Aさんの口座から100万円をマイナスする処理
2. Bさんの口座へ100万円をプラスする処理
もし、トランザクションを利用せずに上記処理を行い、2つ目の処理に失敗した場合、
Aさんの口座からは100万円がなくなり、Bさんの口座はそのままで、お金がなくなってしまう。
つまり、データの不整合が起こってしまう。
こういった場合に、トランザクションを利用すれば、
1,2の処理を1つのトランザクションとしてまとめ、
すべての処理が成功した場合にのみ、口座の変更内容が確定(コミット)される。
処理が一部でも失敗した場合には、すべての処理が取り消される(ロールバック)されるため、
口座の変更は発生せず、データの整合性は維持される。
Laravel での使い方
transaction() メソッドを使用する方法
DB::transaction(function () {
$a -= 100;
$b += 100;
});
クロージャの中で例外が投げられると、自動的にロールバック(処理を取り消し)し、クロージャが正しく実行されると、自動的にコミット(処理を反映)される。
beginTransaction() メソッドを使用する方法(手動トランザクション)
DB::beginTransaction();
try {
// 一連の処理
$a -= 100;
$b += 100;
DB::commit(); // トランザクションをコミット
} catch (Exception $exception) {
DB::rollBack(); // トランザクションをロールバック
throw $exception;
}