cara mengatasi deadlock dalam transaksi database di Laravel
Dipublikasikan pada oleh Admin
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:
Beberapa penyebab umum deadlock antara lain:
Laravel sudah menyediakan mekanisme
Jika ingin lebih fleksibel, Anda bisa membuat mekanisme retry manual
menggunakan
Untuk menganalisa deadlock di MySQL, Anda bisa menggunakan perintah berikut:
Hasilnya akan menunjukkan query mana saja yang menyebabkan deadlock sehingga
bisa dilakukan optimasi.
Deadlock adalah hal yang wajar terjadi pada sistem dengan transaksi paralel.
Cara terbaik mengatasinya adalah dengan:
Dengan langkah-langkah di atas, aplikasi Laravel Anda akan lebih tahan terhadap
deadlock dan tetap berjalan dengan stabil meskipun banyak transaksi paralel.
Cara Mengatasi Deadlock dalam Transaksi Database di Laravel
Deadlock found when trying to get lock; try restarting transactiondeadlock detectedTransaction (Process ID XX) was deadlocked on resources1. Penyebab Deadlock
2. Cara Mencegah Deadlock
READ COMMITTED jika memungkinkan.3. Menangani Deadlock di Laravel
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
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
SHOW ENGINE INNODB STATUS\G
Kesimpulan
DB::transaction() maupun manual dengan try-catch.