はじめに#
トランザクションとは、お互いに関連のある複数の処理をまとめて一つの処理として扱うということを表します。
例えば、銀行口座の振り込み処理などでは、AさんがBさんに1万円振り込んだとすると、Aさんの口座からは1万円出金し、Bさんの口座には1万円入金するという処理が必要になります。この時、Bさんの入金処理が何らかのエラーにより実行されなかった時、Aさんの処理が実行されてしまっては整合性が取れなくなります。このように、関連する処理をひとまとめにして、全ての処理が正常に実行された時に処理を反映させるのがトランザクションというものです。
Laravelでトランザクションを実装#
今回はLaravelでトランザクションを実装します。トランザクションは、DBファサードが提供する機能なので、まずはDBファサードを有効にします。
use Illuminate\Support\Facades\DB;
次に、実際にトランザクションを張っていきます。
まずはクロージャを使用する場合は、このように書きます。
use Illuminate\Support\Facades\DB;
class HomeController extends Controller{
public function transaction(){
DB::transaction(function(){
DB:: 〜何かの処理;
DB:: 〜何かの処理;
});
}
}
このように、クロージャ内で二つ以上の処理を実行し、正常に動作した場合はコミットされ、例外がスローされた場合は自動でロールバックされます。
引数を指定したい場合はこのように書きます。
use Illuminate\Support\Facades\DB;
class HomeController extends Controller{
public function transaction(Request $request){
DB::transaction(function()use($request){
DB:: 〜何かの処理;
DB:: 〜何かの処理;
});
}
}
次に、手動でトランザクションを貼る場合です。
use Illuminate\Support\Facades\DB;
class HomeController extends Controller{
public function transaction(){
try{
DB::beginTransaction();
DB:: 〜何かの処理;
DB:: 〜何かの処理;
DB::commit();
}catch(Throwable $e){
DB::rollBack();
}
}
}
正常に動作すればコミット、例外がスローされればロールバックして処理が終了します。
終わりに#
未経験から転職を目指して勉強中です。
誤り等ありましたらご指摘いただけますと幸いです。