Karar: Hangi izolasyon seviyesi?
Transaction izolasyon seviyesi, eşzamanlılık ile tutarlılık arasındaki dengeyi belirler. Yüksek izolasyon daha az anomali ama daha çok kilitlenme/çakışma ve yeniden deneme demektir. Bu ağaç, hangi okuma anomalilerine (dirty, non-repeatable, phantom) tolerans gösterdiğine göre Read Committed, Repeatable Read/Snapshot ve Serializable arasında seçim yapmanı sağlar.
Dirty read'e toleransın var mı?
En temel anomaliyle başla: bir transaction, henüz commit edilmemiş (belki geri alınacak) veriyi okuyabilmeli mi? Neredeyse hiçbir ciddi uygulama bunu istemez; modern motorların çoğunda varsayılan zaten dirty read'i engeller. Yalnızca yaklaşık/analitik kaba sayımlarda ve maksimum hız için gevşetilir.
- Hayır, kesinlikle commit'lenmiş veriyi okumalıyım
- Evet, kaba/yaklaşık okuma yeterli (nadir)
Aynı işlemde tekrar okuduğunda aynı sonucu görmen şart mı?
Dirty read'i elediysen sıradaki soru: bir transaction içinde aynı satırı iki kez okursan, arada başkası commit'lediği için farklı değer görmen (non-repeatable read) veya yeni satırların belirmesi (phantom) senin için sorun mu? Rapor/hesaplama tutarlılığı gerektiren mantık genelde tutarlı bir snapshot ister.
- Hayır, her ifadenin en güncel commit'li veriyi görmesi iyi
- Evet, transaction boyunca tutarlı bir snapshot gerekli
Eşzamanlı işlemler mantıksal olarak tam sıralı mı olmalı?
Tutarlı okuma istiyorsun; peki bu yeterli mi, yoksa eşzamanlı işlemlerin sanki tek tek, sırayla çalışmış gibi (serileştirilebilir) bir sonuç mu üretmesi şart? Write-skew gibi ince anomalilere (ör. iki işlemin farklı satırları okuyup birbirini geçersiz kılan yazması) tahammülün varsa Snapshot yeter; yoksa tam serileştirme gerekir.
- Hayır, tutarlı snapshot yeterli
- Evet, hiçbir eşzamanlılık anomalisi kabul edilemez
Öneri: Read Uncommitted (yalnızca özel durumlar)
En düşük izolasyon; dirty read'e izin verir. Lock'ları neredeyse hiç beklemeden okur ama geri alınabilecek veriyi görebilirsin. Genel amaçlı uygulamalarda önerilmez.
Öneri: Read Committed (varsayılan OLTP)
Her ifade, o an commit'lenmiş en güncel veriyi görür; dirty read engellenir. Çoğu motorun varsayılanıdır ve tipik OLTP yükleri için eşzamanlılık/tutarlılık dengesi en iyisidir.
Öneri: Repeatable Read / Snapshot (tutarlı okuma)
Transaction, başında (veya ilk okumasında) sabitlenen tutarlı bir snapshot üzerinden çalışır; transaction boyunca okumalar değişmez. MVCC ile okuyucular yazıcıları, yazıcılar okuyucuları bloklamaz.
Öneri: Serializable (tam izolasyon)
En yüksek izolasyon: eşzamanlı transaction'lar, bir seri (tek tek, sırayla) çalıştırılmış gibi bir sonuç üretir. Tüm okuma anomalilerini ve write-skew'i engeller; bedeli daha fazla çakışma ve yeniden deneme ihtiyacıdır.