MySQL Benzersiz İndeks İhlali: Eşzamanlılık Yarışı (Race Condition), ETL Duplikasyonu ve Çözüm Desenleri
Uygulama katmanı race condition ve mükerrer batch kayıtları sonucu oluşan 1062 hatasının tespiti, INSERT IGNORE ve ON DUPLICATE KEY UPDATE desenleri.
Operasyonel Doğrulama & Güvenilirlik Standardı
Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.
▸Belirti
Kullanıcı kaydı veya veri yükleme sırasında işlem kesilir ve şu hata döner:
ERROR 1062 (23000): Duplicate entry 'test@example.com' for key 'users.email_UNIQUE'▸Sahada Ne Görürsün?
Kullanıcı formu kaydederken çift tıkladığında veya iki pod aynı anda aynı kaydı oluşturmaya çalıştığında biri başarılı olurken diğeri HTTP 500 döner.
▸Kök Neden Matrisi
| Olasılık | Kök Neden | Açıklama |
|---|---|---|
| %60 | Eşzamanlı İstek Yarışı (Race Condition) | Uygulama önce SELECT yapıp kayıt olmadığını görüp INSERT eder; iki istek araya girdiğinde ikinci INSERT patlar. |
| %30 | ETL / Batch Tekrarı | Tekrar çalışan veri aktarım scripti mevcut kayıtları ezmek yerine doğrudan eklemeye çalışır. |
| %10 | Büyük/Küçük Harf (Collation) Duyarsızlığı | utf8mb4_0900_ai_ci collation altında Test@example.com ile test@example.com aynı kabul edilir. |
▸ACİL RUNBOOK (0-5dk)
-- 1. Çakışan kaydı bul
SELECT id, email, created_at FROM users WHERE email = 'test@example.com';
-- 2. Tablodaki tüm mükerrer kayıtları listele
SELECT email, count(*) AS c FROM users GROUP BY email HAVING c > 1;
-- 3. Acil idempotent düzeltme: INSERT IGNORE veya ON DUPLICATE KEY UPDATE
INSERT INTO users (email, full_name, updated_at)
VALUES ('test@example.com', 'Test User', NOW())
ON DUPLICATE KEY UPDATE full_name = VALUES(full_name), updated_at = NOW();▸KALICI BLUEPRINT
- 1Check-Then-Act Antipattern'ını Bırakın: Uygulamada
SELECT COUNT(*)yapıp ardındanINSERTetmek yerine doğrudan veritabanının unique constraint'ine güvenin veON DUPLICATE KEY UPDATEkullanın. - 2BIGINT Kullanımı: Sık duplicate denemelerinde
AUTO_INCREMENTid hızla büyüyebileceği için birincil anahtarlarBIGINT UNSIGNEDyapılmalıdır.
▸Doğrulama
SHOW INDEX FROM users WHERE Key_name = 'email_UNIQUE';Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
MySQL ERROR 1045 Access denied: root Şifresi Sıfırlama Rehberi
MySQL 1045 hatasının dört nedeni, "using password: YES/NO" ayrımının anlamı ve kilitli kalınca --init-file ile güvenli şifre sıfırlama.
MySQL Deadlock ERROR 1213: Grafiği Okuma ve Kalıcı Önleme
MySQL 1213 deadlock hatasının nedeni, LATEST DETECTED DEADLOCK çıktısını okuma, gap lock kaynaklı kilitlenmeler ve uygulama tarafında retry tasarımı.
MySQL Lock wait timeout exceeded: Bloklayan İşlemi Bulma
1205 lock wait timeout hatasında bloklayan işlemi performance_schema ile bulma, KILL kararını verme ve kilidi kalıcı olarak azaltma yöntemleri.