cara mengatasi deadlock dalam transaksi database di Laravel

Dipublikasikan pada oleh Admin

Website Custom vs Template

Cara Mengatasi Deadlock dalam Transaksi Database di Laravel

Deadlock dalam database terjadi ketika dua atau lebih transaksi saling menunggu resource (baris, tabel, atau lock) yang sedang digunakan oleh transaksi lain. Akibatnya, tidak ada transaksi yang bisa dilanjutkan, dan biasanya akan muncul error seperti:

  • MySQL: Deadlock found when trying to get lock; try restarting transaction
  • PostgreSQL: deadlock detected
  • SQL Server: Transaction (Process ID XX) was deadlocked on resources

1. Penyebab Deadlock

Beberapa penyebab umum deadlock antara lain:

  • Transaksi mengakses tabel dengan urutan berbeda.
  • Query tidak menggunakan index sehingga mengunci terlalu banyak baris.
  • Transaksi berjalan terlalu lama sehingga lock tidak segera dilepas.
  • Penggunaan isolation level tinggi (REPEATABLE READ atau SERIALIZABLE).

2. Cara Mencegah Deadlock

  • Konsisten dalam urutan akses tabel. Pastikan semua transaksi membaca/menulis tabel dalam urutan yang sama.
  • Gunakan index dengan tepat. Index dapat mengurangi jumlah baris yang terkunci.
  • Batasi transaksi panjang. Commit secepat mungkin agar lock segera dilepas.
  • Pilih isolation level sesuai kebutuhan. Gunakan READ COMMITTED jika memungkinkan.

3. Menangani Deadlock di Laravel

Laravel sudah menyediakan mekanisme DB::transaction() yang dapat digunakan untuk menangani deadlock dengan retry otomatis.

a. Retry Otomatis dengan Transaction


use Illuminate\Support\Facades\DB;

DB::transaction(function () {
    // operasi database di sini
}, 5); // Laravel akan otomatis retry sampai 5 kali jika deadlock
    

b. Retry Manual dengan Try-Catch

Jika ingin lebih fleksibel, Anda bisa membuat mekanisme retry manual menggunakan try-catch dan rollBack().


use Illuminate\Support\Facades\DB;

$maxRetries = 3;

for ($i = 0; $i < $maxRetries; $i++) {
    try {
        DB::beginTransaction();

        // operasi database di sini

        DB::commit();
        break; // keluar jika berhasil
    } catch (\Illuminate\Database\QueryException $e) {
        DB::rollBack();

        // cek apakah error karena deadlock
        if ($i == $maxRetries - 1) {
            throw $e; // lempar error jika sudah maksimal percobaan
        }

        sleep(1); // tunggu sebentar sebelum retry
    }
}
    

4. Monitoring Deadlock

Untuk menganalisa deadlock di MySQL, Anda bisa menggunakan perintah berikut:


SHOW ENGINE INNODB STATUS\G
    

Hasilnya akan menunjukkan query mana saja yang menyebabkan deadlock sehingga bisa dilakukan optimasi.

Kesimpulan

Deadlock adalah hal yang wajar terjadi pada sistem dengan transaksi paralel. Cara terbaik mengatasinya adalah dengan:

  1. Mencegah deadlock dengan query yang efisien, index yang tepat, dan urutan akses tabel yang konsisten.
  2. Menangani deadlock di Laravel dengan mekanisme retry, baik otomatis dengan DB::transaction() maupun manual dengan try-catch.
  3. Monitoring query untuk menemukan sumber masalah dan mengoptimalkan struktur database.

Dengan langkah-langkah di atas, aplikasi Laravel Anda akan lebih tahan terhadap deadlock dan tetap berjalan dengan stabil meskipun banyak transaksi paralel.

← TIPS #4 Cara Cari Cuan dari Website - Bag 3? Fungsi dan Cara Menggunakan Rate Limiting di Laravel →

Cara Mudah Membuat Laporan Keuangan untuk UMKM

Cara Mudah Menyusun Laporan Keuangan Akhir Tahun untuk UMKM Menjelang akhir tahun, ...

Baca Selengkapnya →

Black SEO: Pengertian, Teknik, dan Risiko yang Harus Diwaspadai

Black SEO: Pengertian, Teknik, dan Risiko yang Harus Diwaspadai Apa Itu Black SEO? ...

Baca Selengkapnya →

cara agar jualan laris manis utamanya untuk warga Sidoarjo

Ingin Bisnis di Sidoarjo Laris Manis? Ini Rahasia yang Wajib Anda Ketahui Di Sidoarjo, persaing...

Baca Selengkapnya →

Jasa Pembuatan Website Surabaya

Jasa Pembuatan Website Surabaya Profesional – Deby Sejahtera Surabaya sebagai kota ...

Baca Selengkapnya →

cara mengatasi deadlock dalam transaksi database di Laravel

Cara Mengatasi Deadlock dalam Transaksi Database di Laravel Deadlock dalam da...

Baca Selengkapnya →

TIPS #4 Cara Cari Cuan dari Website - Bag 3?

Tips cari cuan dari website - bagian ke 3 11. Membangun Marketplace Niche Buat marketplace ke...

Baca Selengkapnya →