MongoDB Benzersiz İndeks Çakışması: Eşzamanlı İstek Yarışı, Upsert Hataları ve İdempotent Yazma
Aynı anahtara sahip iki dokümanın eşzamanlı eklenmesiyle oluşan E11000 hatasının tespiti, getIndexes denetimi ve $setOnInsert ile upsert 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
Uygulama doküman eklerken veya güncellerken işlem reddedilir:
MongoServerError: E11000 duplicate key error collection: prod.users index: email_1 dup key: { email: "a@b.com" }▸Sahada Ne Görürsün?
Kullanıcı kayıt olurken aynı anda iki istek attığında veya arka plan veri eşitleme işçileri çalıştığında biri başarılı olurken diğeri E11000 ile düşer.
▸Kök Neden Matrisi
| Olasılık | Kök Neden | Açıklama |
|---|---|---|
| %65 | Eşzamanlı İstek Yarışı (Race Condition) | İki thread önce findOne yapıp olmadığını teyit eder, ardından ikisi de insertOne çağırınca ikinci istek unique index'e çarpar. |
| %25 | `insertMany` Ordered Varsayılanı | Toplu eklemede tek bir duplikasyon olduğunda ordered: true tüm batch'i abort eder. |
| %10 | Null Değerlerin Çakışması | İndekslenen alan dokümanlarda bulunmadığında (null), birden fazla null değer unique kısıtına takılır. |
▸ACİL RUNBOOK (0-5dk)
// 1. İndeksi ve çakışan dokümanı gör
db.users.getIndexes();
db.users.find({ email: "a@b.com" });
// 2. Acil idempotent upsert çözümü:
db.users.updateOne(
{ email: "a@b.com" },
{
$set: { last_login: new Date() },
$setOnInsert: { created_at: new Date(), name: "Ali" }
},
{ upsert: true }
);
// 3. Toplu eklemede hatanın diğer satırları durdurmasını engelle
db.users.insertMany(docs, { ordered: false });▸KALICI BLUEPRINT
- 1Atomik Upsert Standardı:
find+insertyerine daima atomikupdateOne(..., {upsert: true})kullanılmalıdır. - 2Partial / Sparse Index: Eksik alanların null çakışması yaratmaması için sparse veya partial filter index tanımlanmalıdır:
db.users.createIndex({ phone: 1 }, { unique: true, sparse: true });▸Doğrulama
db.users.getIndexes().filter(idx => idx.unique);Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
MongoDB "not master" / NotWritablePrimary Hatası
Failover sonrası "not master" hatasının nedeni, replicaSet içermeyen bağlantı dizesi, retryWrites ve election fırtınası teşhisi.
MongoDB MongoNetworkError & HostUnreachable Teşhisi
Replica set primary düğümünün çökmesi, yanlış mongodb+srv dizesi ve ağ gecikmelerinde sürücünün bağlantı havuzunu temizlemesi; rs.status() ve kalıcı timeout ayarları.
MongoDB WriteConcernFailed & wtimeout Teşhisi
Replica set üyelerinden birinin çevrimdışı olması veya aşırı ikincil lag nedeniyle majority onayının verilememesi; rs.printSecondaryReplicationInfo() analizi ve wtimeout bütçesi.