Bilgi Bankası
MySQLPerformans ve kapasite 13 dk 14.06.2026

MySQL lock wait timeout: hangi sorgu kimi bekletiyor?

MySQL’de lock wait timeout çoğu zaman yavaş sorgu gibi görünür ama kökte bekleyen bir transaction vardır. Doğru soru “hangi sorgu yavaş?” değil, “kim kimi bekletiyor?” olmalıdır.

Bu yazı sana şu durumda yardımcı olur
  • Lock wait timeout exceeded hatası alınıyor
  • bazı UPDATE veya DELETE sorguları takılıyor
  • uygulamada sipariş veya ödeme adımı ara ara donuyor
  • uzun transactionlar kapanmıyor
  • restart düşünülüyor ama neden bilinmiyor
Yazıyı bitirince

MySQL kilit beklemesini InnoDB seviyesinde okuyabilecek, kilitleyen oturumu bulabilecek ve güvenli müdahale kararını daha sakin verebileceksiniz.

TürkDB açısından ürünleşme notu

Bu bölüm, TürkDB’nin ilgili problemi hangi ürün ilkeleri ve kontrol noktalarıyla ele alacağını anlatır. Kapsam, gerçek iş yükü ve ihtiyaçla birlikte netleşir.

TürkDB MySQL tarafında olay, bağlantı, replika ve bakım bağlamını görünür kılmayı hedefler. Kilit kararının kendisi yine MySQL çıktısıyla verilir; platform doğru kanıta daha hızlı ulaşmayı kolaylaştırmalıdır.

Lock wait timeout yavaş sorgu değildir

Bir sorgu 50 saniye bekleyip hata verdiğinde ilk refleks indeks aramak olabilir. Ama lock wait timeout çoğu zaman sorgunun hesap yapmasından değil, başka bir transaction’ın tuttuğu kilidi beklemesinden kaynaklanır.

Bu ayrımı doğru yapmak önemlidir. İndeks eklemek bazı kilitleri azaltabilir ama açık kalmış transaction, yanlış sırada güncelleme veya büyük toplu işlem varsa asıl sorun devam eder.

  • Bekleyen sorgu mağdur olabilir; suçlu kilidi tutan sorgudur.
  • Uzun transactionlar satır kilitlerini gereğinden fazla tutar.
  • Toplu UPDATE/DELETE işlemleri küçük parçalara bölünmelidir.
  • Kilit sorununda restart son çare olmalı, önce kanıt toplanmalıdır.

Kimin kimi beklettiğini bulun

MySQL 8 tarafında performance_schema ve sys tabloları kilit beklemelerini anlamak için değerlidir. Ama her ortamda bu görünümler aynı açıklıkta olmayabilir. En azından processlist ve InnoDB status çıktısı alınmalıdır.

Olay anında bu çıktıları saklamak, sonradan kök nedeni bulmayı kolaylaştırır. Sorun düzeldikten sonra kanıt yoksa aynı hata tekrarlandığında ekip yine tahminle ilerler.

Kilit bekleme kontrolü

mysql-lock-wait.sql
select * from sys.innodb_lock_waits\G

show full processlist;

show engine innodb status\G

Müdahale etmeden önce iş etkisini anlayın

Kilit tutan oturumu sonlandırmak bazen doğru karardır; ama neyi yarıda keseceğinizi bilmeden yapılırsa daha büyük sorun çıkarabilir. Ödeme, stok, fatura veya migration işlemi ortadaysa karar iş tarafıyla birlikte verilmelidir.

Eğer kilitleyen işlem rapor veya bakım işi ise durdurmak daha kolay olabilir. Eğer canlı kullanıcı işlemi ise uygulamanın tekrar deneme davranışı ve veri tutarlılığı düşünülmelidir.

Son çare oturum sonlandırma

mysql-kill-session.sql
-- Önce processlist içinden doğru id bulunmalıdır.
kill 12345;

Bu adım kanıt toplandıktan ve iş etkisi anlaşıldıktan sonra düşünülmelidir.

Tekrarı önlemek için transaction disiplinine bakın

Kilit beklemelerini azaltmanın kalıcı yolu, transactionları kısa tutmak, kullanıcı etkileşimiyle transaction açık bırakmamak, güncelleme sırasını standartlaştırmak ve büyük değişiklikleri parçalara bölmektir.

Ayrıca foreign key ve indeks eksikleri de kilit alanını büyütebilir. Yavaş sorgu ve kilit analizi birlikte okunursa sorun daha net görünür.

Devam etmek istersen

Sorunu motor bazında derinleştirin

Benzer belirtiler farklı motorlarda farklı nedenlere dayanır; yayınlanan tüm rehberleri ana sayfadan takip edebilirsiniz.

Tüm makaleler