🔴 Transaction Yapısı
Transaction Yapısı: Transaction'ı bir nikâh töreni gibi düşün: 'evet' iki taraftan da gelmeden kimse evli sayılmaz, biri yarıda vazgeçerse tören yarım kalmaz — hiç olmamış sayılı
Transaction'ı bir nikâh töreni gibi düşün: 'evet' iki taraftan da gelmeden kimse evli sayılmaz, biri yarıda vazgeçerse tören yarım kalmaz — hiç olmamış sayılır. Havalede de aynısı geçerlidir: paranın A hesabından çıkması VE B hesabına girmesi tek bir bütündür; ikisinin arasında elektrik kesilirse veritabanı yarım işi kabul etmez, `ROLLBACK` ile başlangıç anına döner. Peki 'yarım kalırsa geri al' fikri bu kadar bariz iken, neden bunu uygulama kodunda kendimiz yapamıyoruz — hata yakalayıp ters UPDATE atmak yetmez mi? Yetmez, ve nedeni düşündürücüdür: telafi kodunun kendisi de çökebilir. Para çıktıktan sonra process öldüyse, o telafi UPDATE'ini çalıştıracak kimse kalmamıştır. Transaction'ın gücü, garantiyi **senin kodundan alıp** veritabanının kendi kurtarma günlüğüne (WAL/redo log) taşımasıdır — orada sözü tutacak olan, çöken sürecin kendisi değildir. Java'daki `synchronized` bloğu yüzeyde benzer görünür ama farkı bilmek kritiktir: `synchronized` sadece **izolasyon** verir (aynı anda iki thread girmesin), atomiklik veya kalıcılık vermez — JVM çökerse yarım kalan iş yarım kalır. Transaction ACID'in dördünü birden verir: Atomic, Consistent, Isolated, Durable. QA tarafında transaction en çok test verisi hazırlarken işe yarar ve en çok orada unutulur: `BEGIN` ile açılıp `COMMIT`/`ROLLBACK` ile kapatılmayan bir session, tabloyu kilitli bırakır ve o tabloya dokunan diğer bütün testler timeout ile düşer. Sabah gelip 'dün gece 40 test aynı anda kırılmış' dediğin senaryoların klasik sebebi budur — testlerin hiçbiri bozuk değildir, biri kilidi bırakmamıştır. Tersi de bir tekniktir: testi transaction içinde koşup sonunda `ROLLBACK` çekmek, veritabanını test öncesi hâline birebir döndürür.
Transaction'lar — ACID Özellikleri
Micro Lab: SQL — GROUP BY / CTE / Window
TODO satirini beklenen cozumdeki kritik satirla degistir. Bu gercek runtime degil; amac dogru yapinin yazilmasini kontrollu olarak pekistirmek.
Adim Adim: SQL — GROUP BY / CTE / Window
Aggregation mi Window mi?
Aggregation (ozetleme) mi Window (satir bazli hesap) mi? Onu belirle
Aggregation icin GROUP BY ile ozetlenecek sutunu sec
HAVING ile gruplara kosul uygula — WHERE gibi ama agregasyon sonrasinda
WITH cte_adi AS (...) SELECT ... FROM cte_adi ile sorguyu modülerlestir
OVER(PARTITION BY) ekle
Window icin SUM(col) OVER (PARTITION BY bolum ORDER BY siralama) kullan
SQL GROUP BY ve Window Function sorgusu yazma sirasi nedir?
Transaction Yönetimi ve ACID Prensipleri