Menggunakan Transaction di Laravel

Tidak jarang dalam sebuah aplikasi akan ada sebuah proses CRUD yang terkait antara satu dengan yang lainnya, misalnya, ada dua tabel, user dan profile, di mana tabel profile diisi setelah tabel user selesai diproses dikarenakan tabel profile membutuhkan userid dari tabel user. Maka codingnya kurang lebih seperti ini di laravel.

<?php 

$user = User::create($data);
$data_profile["userid"] = $user->id;
$profile = Profile::create($data_profile);

Sehingga data profile seharusnya konsisten dengan data user, karena saat user dibuat begitupun dengan profile.

Tapi kadang-kadang ada sebuah hal – entah itu koneksi hilang atau masalah lainnya – yang membuat setelah user berhasil diproses tapi profile gagal dieksekusi, sehingga akhirnya data tidak konsisten karena data di user ada di profile tidak. Disinilah transaction berguna.

Transaction sederhananya adalah blok proses yang memungkinkan kita untuk membatalkan sebuah proses jika ada proses lain yang gagal. Polanya kurang lebih seperti ini :

Transaction

blok proses

commit

if error

rollback

Commit di sana artinya bahwa proses benar-benar berhasil sedangkan rollback artinya membatalkan semua proses. Akhirnya jika ini diterapkan ke laravel, coding akhirnya akan seperti ini.

<?php 
DB::beginTransaction();
    try {
        $user = User::create($data);
        $data_profile["userid"] = $user->id;
        $profile = Profile::create($data_profile);
        DB::commit();
        return true;
    // all good
    } catch (\Exception $e) {
        DB::rollback();
        // something went wrong
        return $e;
    }