Tutorial Laravel 9 - Part #12 - Menggunakan Database Transaction

Mengapa Penting Menggunakan Database Transaction?

Konsistensi dan keakuratan data adalah sesuatu yang krusial dalam sebuah aplikasi. Karena sangat sering terjadi, masalah ditemui dalam aplikasi yang kita buat ternyata disebabkan oleh data yang tidak konsisten dan akurat. Database Transaction adalah pendekatan yang paling efektif untuk menjaga konsistensi dan keakuratan data tersebut. Oleh karena itu, ketika kita membuat sebuah method yang di dalamnya terdapat beberapa proses perubahan data ke tabel-tabel database sangat direkomendasikan untuk mengimplementasikan Database Transaction agar integritas data terjaga dengan baik.

Implementasi Database Transaction di Laravel 9

Laravel memberikan kita kemudahan dalam mengimplementasikan database transaction dalam kode program. Kita diberikan pilihan apakah mau menghandle transaction secara otomatis atau manual.

Terdapat 3 method utama yang umumnya digunakan dalam implementasi Database Transaction yaitu:


  • DB::beginTransactions : adalah untuk memulai sebuah block database transaction.
  • DB::commit : adalah untuk menyimpan proses database yang dilakukan.
  • DB::rollback: adalah untuk membatalkan semua proses database yang dilakukan.

Kita akan ambil contoh sederhana dari postingan sebelumnya tentang CRUD dengan Beberapa Tabel Ber-relasi. Pada saat create produk maka proses yang terjadi adalah:

  1. Tambah data ke tabel products
  2. Mengaitkan produk dengan kategori yang dipilih dengan tambah data pada tabel pivot category_product

Kode program tanpa database transaction adalah seperti berikut:

public function store(StoreProductRequest $request)
{
        $params = $request->validated();
        if ($product = Product::create($params)) {
            $product->categories()->sync($params['category_ids']);

            return redirect(route('products.index'))->with('success', 'Added!');
        }
}
Automatic Database Transaction

Kode program di atas kalau kita implementasikan dengan automatic database transaction maka akan menjadi seperti berikut:

public function store(StoreProductRequest $request)
{
        $params = $request->validated();

        $saveProduct = false;
        $saveProduct = DB::transaction(function () use ($params) {
            $product = Product::create($params);
            $product->categories()->sync($params['category_ids']);

            return true;
        });
        
        if ($saveProduct) {
            return redirect(route('products.index'))->with('success', 'Added!');
        }

        return redirect(route('products.index'))->with('error', 'Failed!');
}

Jika terjadi kegagalan proses di dalam block:

DB::transaction(function () use ($params) {

});

Maka semua proses otomatis akan di batalkan / rollback , dan jika tidak ada proses yang gagal maka proses database akan disimpan/ commit.

Manual Database Transaction

Manual database transaction ini mungkin baru kita butuhkan ketika terdapat proses update data ke database yang cukup kompleks dan kita ingin melakukan rollback atau commit pada step tertentu sesuai yang kita inginkan. Kode program di atas kalau kita tulis dengan manual database transaction akan menjadi seperti berikut:

public function store(StoreProductRequest $request)
{
        $params = $request->validated();

        DB::beginTransaction();
        try {
            $product = Product::create($params);
            $product->categories()->sync($params['category_ids']);
            // Commit Transaction : semua proses berjalan sukses
            DB::commit();

            return redirect(route('products.index'))->with('success', 'Added!');

} catch (Exception $e) {
            // Rollback: ada proses yang error
            DB::rollBack();
            return redirect(route('products.index'))->with('error', 'Failed!');
        }
}

Download Source Code

Source code tutorial ini dapat di download di repo github : https://github.com/gieart87/tutorial-laravel9/tree/feature/laravel9-database-transaction

Selamat mencoba!

Tulis Komentar