SQL Server Birincil Anahtar & Benzersiz Kısıtlama İhlali: IDENTITY Reseed Kayması, Eşzamanlılık ve Güvenli Çözüm
IDENTITY değerlerinin çakışması, ETL süreçlerinde duplikasyon ve MERGE yarış durumları; DBCC CHECKIDENT kontrolü ve SEQUENCE optimizasyonu.
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
Uygulama veri eklerken işlem reddedilir ve şu hata fırlatılır:
Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK_Users'. Cannot insert duplicate key in object 'dbo.Users'. The duplicate key value is (1052).
The statement has been terminated.▸Sahada Ne Görürsün?
Tabloya yeni kayıt eklenemez. Otomatik artan ID (IDENTITY) kullanılmasına rağmen SQL Server var olan bir ID değerini üretip birincil anahtara çarpmaktadır.
▸Kök Neden Matrisi
| Olasılık | Kök Neden | Açıklama |
|---|---|---|
| %50 | IDENTITY Reseed Kayması | Toplu veri yükleme (SET IDENTITY_INSERT ON) veya SQL Server beklenmedik kapanması sonrası IDENTITY sayacı mevcut MAX(id) değerinin gerisinde kalmıştır. |
| %35 | ETL / Uygulama Duplikasyonu | Eşzamanlı iki işlem aynı benzersiz değere (ör. TC Kimlik, Email) sahip satırı eklemeye çalışır. |
| %15 | MERGE Yarış Durumu (Race Condition) | MERGE komutu kilit hint'i (HOLDLOCK) olmadan çalıştırıldığında eşzamanlı istekler duplicate üretir. |
▸ACİL RUNBOOK (0-5dk)
-- 1. Çakışan değeri gör
SELECT * FROM dbo.Users WHERE id = 1052;
-- 2. Tablodaki maksimum ID ile mevcut IDENTITY sayacını karşılaştır
SELECT MAX(id) AS MaxID FROM dbo.Users;
DBCC CHECKIDENT ('dbo.Users', NORESEED);
-- 3. IDENTITY sayacını tablodaki en yüksek değerin üzerine otomatik düzelt
DBCC CHECKIDENT ('dbo.Users', RESEED);
-- Veya manuel olarak güvenli bir değere çek:
-- DBCC CHECKIDENT ('dbo.Users', RESEED, 2000);▸KALICI BLUEPRINT
- 1MERGE Eşzamanlılık Koruması:
MERGEkomutlarında hedef tabloya mutlakaWITH (HOLDLOCK)hint'i verilmelidir. - 2SEQUENCE Nesnesi: Yüksek eşzamanlılıklı sistemlerde IDENTITY yerine önbellekli
SEQUENCEmimarisine geçilmelidir.
▸Doğrulama
DBCC CHECKIDENT ('dbo.Users', NORESEED);
-- Çıktıda 'Current identity value' >= 'Current column value' olmalıdırDiğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
SQL Server Error 18456: State Kodlarına Göre Gerçek Neden
18456 hatasında State numarası gerçek nedeni söyler. State 5, 8, 11, 18, 38 ve 40 için ayrı çözümler, ERRORLOG okuma komutları.
SQL Server Error 1205 Deadlock: Grafiği Bulma ve Önleme
SQL Server 1205 hatasında deadlock grafiğini system_health oturumundan çıkarma, kurban seçimini anlama ve kalıcı önleme yöntemleri.
SQL Server Pool Timeout: Bağlantı Havuzu Tükenmesi Çözümü
"Timeout expired prior to obtaining a connection from the pool" hatasının komut zaman aşımından farkı, sızıntı tespiti ve .NET tarafında kalıcı düzeltme.