🚨 Yaygın Hatalar

Yaygın Hatalar: Veritabanı hata mesajlarını, arabanın gösterge panelindeki uyarı ışıkları gibi düşün. Işık sana arızayı söylemez — nereye bakman gerektiğini söyler.

Veritabanı hata mesajlarını, arabanın gösterge panelindeki uyarı ışıkları gibi düşün. Işık sana arızayı söylemez — nereye bakman gerektiğini söyler. 'Yağ basıncı' ışığı yandığında sorun ışıkta değildir; yanlış yapılan şey, ışığı görmezden gelip yola devam etmektir. Peki hata mesajı zaten sorunu yazıyorsa, neden kök neden aramak diye ayrı bir iş var? Çünkü veritabanı sana **belirtiyi** söyler, **sebebi** değil. `FOREIGN KEY constraint failed` mesajı 'olmayan bir kayda referans verdin' der; ama bunun gerçek sebebi çoğu zaman testin sildiği bir parent kaydı, ya da iki testin aynı ID'yi paylaşmasıdır. `database is locked` mesajı 'başkası tutuyor' der; gerçek sebep ise `COMMIT` çağırmayı unutmuş bir setup fonksiyonudur. Belirtiyi düzeltirsen (constraint'i kaldırmak, timeout'u artırmak) hata susar ama sebep büyür — ve bir sonraki sefer production'da patlar. Java'da bu refleks zaten var: `NullPointerException` gördüğünde null kontrolü eklemekle yetinmez, 'bu değer neden null geldi' diye stack trace'i yukarı doğru okursun. Veritabanı hatalarında da aynısını yap; fark şu ki SQL'de stack trace yoktur — onun yerine sorgunun kendisi, etkilenen satır sayısı ve transaction'ın açık kalıp kalmadığı senin izlerindir. QA açısından bu bölüm doğrudan sahadaki en sinsi hata sınıfını hedefler: hata VERMEYEN yanlışlar. `UNIQUE constraint failed` en azından bağırır; sessizce 0 satır güncelleyen bir UPDATE ise hiçbir şey söylemez ve testin yeşil yanar. Bu yüzden kural: yalnızca exception yakalamakla yetinme, etkilenen satır sayısını da assert et.

Aynı email/id gibi eşsiz (UNIQUE) kısıtlama olan bir sütuna tekrar eden değer eklemeye çalışıyorsunuz. PRIMARY KEY ihlali de aynı hatayı verir.

Parent tabloda olmayan bir değere referans veren kayıt eklemeye çalışıyorsunuz. Örneğin: var olmayan bir user_id ile order eklemek.

NOT NULL kısıtlamalı bir sütuna NULL değer eklemeye ya da bu sütunu INSERT sorgusunda atlamaya çalışıyorsunuz.

SQL yazım hatası: yanlış yazılmış keyword (FROM yerine FORM), virgül eksikliği, fazladan parantez veya rezerve kelime kullanımı.

Sorgu var olmayan bir tabloyu referans alıyor. Tablo henüz oluşturulmamış, yanlış yazılmış veya farklı bir veritabanı bağlantısında oluşturulmuş olabilir.

JOIN sorgusunda aynı sütun adı birden fazla tabloda bulunuyor ve hangi tablodan geldiği belirtilmemiş.

INSERT sorgusunda sütun listesi ile VALUES listesindeki eleman sayısı eşleşmiyor.

Başka bir transaction aynı satırı/tabloyu kilitlemiş ve sizin sorgunuz bu kilidin açılmasını beklerken zaman aşımına uğramış.

Veritabanı Hatalarını Giderme (Troubleshooting)

Otomasyon testleri sırasında karşılaşılan yaygın veritabanı hataları şunlardır: - **Lock Wait Timeout Exceeded**: Eşzamanlı iki işlem aynı satırı güncellemeye çalıştığında oluşur. Bir test açık transaction bırakırsa (COMMIT/ROLLBACK unutulursa) sonraki test satır kilidi (row lock) nedeniyle bekler ve zaman aşımına uğrar. - **FOREIGN KEY Constraint Failed**: İlişkili tablolarda parent tabloda var olmayan bir kimlik (id) değeriyle child tabloya veri eklenmeye çalışıldığında ortaya çıkar. Sıralı ekleme yapılmalıdır.

🎬 Lock Wait Timeout: Kim Kilidi Tutuyor?

Transaction A (COMMIT yok)

Transaction B (Bekliyor)