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 →

Panduan dan tips agar website muncul di pencarian Google

Panduan dan Tips Agar Website Muncul di Pencarian Google Memiliki website saj...

Baca Selengkapnya →

Ingin Menambah Cabang, Tapi Khawatir Pembukuan? Ini Solusinya untuk UMKM

Ingin Menambah Cabang, Tapi Khawatir Pembukuan? Ini Solusinya untuk UMKM Bagi banyak ...

Baca Selengkapnya →

Bangun Bisnis Modern: Website Custom, Kasir Pintar & CRM Cerdas

Pendahuluan Di era persaingan bisnis yang semakin ketat, digitalisasi bukan s...

Baca Selengkapnya →

Jasa Pembuatan Website Sidoarjo

Jasa Pembuatan Website Sidoarjo Profesional &amp; Terpercaya – Deby Sejahtera Di er...

Baca Selengkapnya →

9 Alat Content Marketing untuk Memaksimalkan Strategi Konten - Bag 3

7. Trello Konsistensi adalah kunci dalam content marketing. ...

Baca Selengkapnya →

Struktur Website yang Baik untuk SEO

Apa itu Struktur Website? Struktur website adalah susunan halaman dan hubungan an...

Baca Selengkapnya →