0Pricing
Coding Interview Prep · Ders

Kirli, Tekrarlanamayan ve Hayalet Okumalar

Üç okuma tutarsızlığı ve her birini hangi yalıtım düzeyinin önlediği.

Kirli, Tekrarlanamayan ve Hayalet Okumalar, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.

Üç Okuma Anomalisi

Yalıtım düzeyleri, okuma anomalileri adı verilen belirli eşzamanlılık hatalarını önlemek için vardır. Mülakatçılar, üçünü de kesin biçimde tanımlamanızı ve her birini onu durduran düzeyle eşleştirmenizi bekler.

  • Kirli okuma - UNCOMMITTED verileri okuma
  • Tekrarlanamaz okuma - iki okuma arasında bir satırın değişmesi
  • Hayalet okuma - iki okuma arasında yeni satırların görünmesi

Buradaki püf noktası, her ikisi de yeniden sorgulama ve farklı sonuçlar alma içerdiği için tekrarlanamaz okumayı hayalet okumadan ayırt etmektir.

Kirli Okuma: Tanım

Kirli okuma, T1 işlemi, T2 işleminin değiştirmiş ancak henüz COMMIT etmemiş olduğu bir satırı okuduğunda gerçekleşir. T2 ardından ROLLBACK yaparsa T1, gerçekte hiç var olmamış verilere dayanarak işlem yapmış olur.

Yalnızca READ UNCOMMITTED kirli okumalara izin verir. Daha yüksek tüm düzeyler bunları engeller.

Gerçek dünya tehlikesi: Birkaç saniye sonra ROLLBACK edilen bir para yatırma işlemine dayanarak kredi onaylamak.

Kirli Okuma: Zaman Çizelgesi

İki sütunu bir zaman çizelgesi olarak okuyun. T1, READ UNCOMMITTED düzeyinde çalışıyor.

T1 bakiyeyi 700 olarak görür, ancak T2 hiçbir zaman COMMIT etmez. 700, T2'nin devam eden çalışmasının oluşturduğu bir hayaletti. T2 ROLLBACK yaptıktan sonra gerçek değer hâlâ 500'dür. T1, geçersiz verilere dayanarak karar vermiştir.

-- T2 (not committed)        | -- T1 (READ UNCOMMITTED)
BEGIN;                       |
UPDATE accounts              |
  SET balance = 700          |
  WHERE id = 1;              |
                             | SELECT balance FROM accounts
                             |   WHERE id = 1;  -- reads 700 (dirty!)
ROLLBACK;                    |
                             | -- T1 acted on a value that never existed

Tekrarlanamaz Okuma: Tanım

Tekrarlanamaz okuma, T1 bir satırı okuduğunda, T2 aynı satırdaki bir güncelleme veya silme işlemini COMMIT ettiğinde ve T1 satırı yeniden okuyup farklı bir değer gördüğünde gerçekleşir.

Kirli okumadan temel farkı unutmayın: Burada T2 işlemi COMMITTED durumundadır. Veriler gerçektir, ancak tek bir işlem içinde T1'in altında değişmiştir.

READ COMMITTED buna hâlâ izin verir. REPEATABLE READ ve daha yüksek düzeyler, sabit bir anlık görüntüden okuyarak bunu önler.

Tekrarlanamaz Okuma: Zaman Çizelgesi

T1, READ COMMITTED düzeyinde çalışır ve aynı satırı iki kez okur. Okumalar arasında T2 bir değişikliği COMMIT eder.

Aynı birincil anahtar, tek bir işlem içinde iki farklı değer döndürür. Bu tutarsızlık, satırın sabit olduğunu varsayan çok adımlı mantığı bozabilir.

-- T1 (READ COMMITTED)              | -- T2
BEGIN;                              |
SELECT balance FROM accounts        |
  WHERE id = 1;  -- 500            |
                                    | BEGIN;
                                    | UPDATE accounts SET balance = 900
                                    |   WHERE id = 1;
                                    | COMMIT;
SELECT balance FROM accounts        |
  WHERE id = 1;  -- 900 (changed!) |
COMMIT;                             |

Hayalet Okuma: Tanım

Hayalet okuma, T1 bir arama koşulu içeren sorguyu çalıştırdığında, T2 bu koşulla eşleşen satırları INSERT (veya DELETE) edip COMMIT ettiğinde ve T1 sorguyu yeniden çalıştırıp farklı bir satır kümesi gördüğünde gerçekleşir.

Tekrarlanamaz okumadan farkı şudur: Tekrarlanamaz okuma, mevcut bir satırın değerinin değişmesiyle ilgilidir; hayalet okuma ise bir koşulla eşleşen satırların sayısının değişmesiyle ilgilidir.

Standart, hayalet okumaları yalnızca SERIALIZABLE düzeyinin önlemesini garanti eder.

Hayalet Okuma: Zaman Çizelgesi

T1, yüksek değerli hesapları iki kez sayar. Sayımlar arasında T2, koşulu karşılayan yeni bir satır ekler ve COMMIT eder.

Mevcut hiçbir satır değişmemiştir, ancak COUNT sonucu farklıdır. Yeni satır, T1'in sonuç kümesinde ortaya çıkan "hayalet"tir.

-- T1 (REPEATABLE READ, standard)      | -- T2
BEGIN;                                 |
SELECT COUNT(*) FROM accounts           |
  WHERE balance > 1000;  -- 3          |
                                       | INSERT INTO accounts(id, balance)
                                       |   VALUES (99, 5000);
                                       | COMMIT;
SELECT COUNT(*) FROM accounts           |
  WHERE balance > 1000;  -- 4 (phantom)|
COMMIT;                                |

Anomalilerin Düzeylerle Eşleştirilmesi

Bu eşleştirme, konunun temelidir. Her anomaliyi önleyen en düşük düzey şöyledir:

  • Kirli okuma, READ COMMITTED ve üzeri düzeylerde önlenir.
  • Tekrarlanamaz okuma, REPEATABLE READ ve üzeri düzeylerde önlenir.
  • Hayalet okuma, standarda göre SERIALIZABLE düzeyinde önlenir.

Adların nasıl örtüştüğüne dikkat edin: REPEATABLE READ, okumaları tekrarlanabilir hâle getirir; düzeyler, yeni önledikleri anomalilerin adlarını taşır.

Tekrarlanamaz Okuma ve Hayalet Okuma: Kesin Ayrım

En yaygın mülakat karışıklığı budur. Şu cümleyi aklınızda tutun:

Tekrarlanamaz okuma = mevcut bir satırın değeri değişir. Hayalet okuma = eşleşen satır kümesi değişir (satırlar eklenir veya kaldırılır).

Kendinizi sınayın: T2 UPDATE ... WHERE id = 5 işlemini gerçekleştirip COMMIT eder ve T1, 5 numaralı satırı yeniden okur. Bu, tekrarlanamaz okumadır. T2, T1'in WHERE koşuluyla eşleşen yeni bir satıra INSERT uygular ve T1 sorguyu yeniden çalıştırır. Bu ise hayalet okumadır.

Yazma Çarpıklığı: Ek Anomali

Kıdemli düzey mülakatlarında, standarttaki üç anomaliye ek olarak yazma çarpıklığı da sorulabilir: İki işlem, kesişen bir kümenin her ikisi de okur, okuduklarına dayanarak birbirinden bağımsız yazma işlemleri yapar ve ikisi de COMMIT olur. Bunun sonucunda, tek başına izin vermeyeceği bir durum ortaya çıkar.

Klasik örnek: İki doktor nöbettedir; her biri başka bir doktorun nöbette olduğunu kontrol eder ve ardından kendisini nöbetten çıkarır. İkisi de başarılı olur ve hiç nöbetçi kalmaz.

Anlık görüntü yalıtımı (Postgres REPEATABLE READ), yazma çarpıklığına izin verir; bunu yalnızca SERIALIZABLE engeller. Bundan söz etmeniz konuya derinlemesine hâkim olduğunuzu gösterir.

Kaybolan Güncelleme: Dördüncü Tuzak

Mülakatçılar bazen standarttaki anomali listesinde yer almayan, ancak uygulamada sürekli görülen kaybolan güncelleme durumunu da sorar. İki işlem aynı değeri okur, bu değere göre yeni bir değer hesaplar ve sonucu geri yazar. İkinci yazma işlemi, birincinin üzerine sessizce yazar.

Örnek: İki para transferi, bakiyeyi 500 olarak okur, her biri bir miktarı düşer ve sonucunu yazar. Çıkarmalardan biri kaybolur.

Çözüm yalnızca daha yüksek bir yalıtım düzeyi kullanmak değildir; SELECT ... FOR UPDATE ile açık kilitleme yapmak veya hesabı uygulama yerine veritabanında gerçekleştiren atomik bir güncelleme kullanmaktır.

-- Safe pattern: lock the row, or compute atomically
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;  -- locks row
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
-- Or simply: UPDATE accounts SET balance = balance - 100 WHERE id = 1;

Hızlı Kontrol

Davranışından anomalinin hangisi olduğunu belirleyin.

Özet: Anomaliler ve Çözümleri

Daha yüksek bir yalıtım düzeyiyle giderilen üç okuma anomalisi:

  • Kirli okuma (UNCOMMITTED veriler) - READ COMMITTED düzeyinde giderilir.
  • Tekrarlanamaz okuma (mevcut satır değerinin değişmesi) - REPEATABLE READ düzeyinde giderilir.
  • Hayalet okuma (eşleşen satır kümesinin değişmesi) - SERIALIZABLE düzeyinde giderilir.

Tekrarlanamaz okuma ile hayalet okuma arasındaki kesin ayrımı koruyun; mülakatçı daha fazlasını isterse yazma çarpıklığından söz edin. Sırada, altyapıların yalıtımı gerçekte nasıl uyguladığını inceleyeceğiz: kilitleme, kilitlenmeler ve MVCC.

Sıkça Sorulan Sorular

“Kirli, Tekrarlanamayan ve Hayalet Okumalar” dersi ücretsiz mi?

Evet — “Kirli, Tekrarlanamayan ve Hayalet Okumalar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.

“Kirli, Tekrarlanamayan ve Hayalet Okumalar” dersinde ne öğreneceğim?

Üç okuma tutarsızlığı ve her birini hangi yalıtım düzeyinin önlediği. Coding Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Coding Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Kirli, Tekrarlanamayan ve Hayalet Okumalar” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Coding Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. ACID Özelliklerini Açıklama
  2. Dört Yalıtım Düzeyi
  3. Kirli, Tekrarlanamayan ve Hayalet Okumalar
  4. Kilitlenmeler, Kilitleme ve MVCC
← Coding Interview Prep Sayfasına Dön