DBAtlas · Veritabanı operasyon atlası

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.

DBAtlas'ta aç →