İzolasyon Seviyeleri: Eşzamanlı İşlemler Birbirini Ne Kadar Görür?
İşlem yalıtım seviyeleri, eşzamanlı veritabanı işlemlerinin birbirinin verisini ne ölçüde göreceğini belirler. Anomaliler, seviyeler ve seçim ölçütleri.
İşlem yalıtım seviyesi nedir?
İşlem yalıtım seviyesi (isolation level, izolasyon seviyesi), aynı anda çalışan veritabanı işlemlerinin birbirinin yarım kalmış ya da sonradan değişmiş verisini ne ölçüde görebileceğini belirleyen ayardır. ACID ilkelerindeki yalıtımın (isolation) uygulamada ayarlanabilir hale gelmiş biçimidir.
Tam yalıtım, işlemlerin sanki tek tek ve sırayla çalışmış gibi sonuç vermesi demektir. Bunu sağlamak kilit beklemesi ve işlem geri alma maliyeti getirdiği için veritabanları gevşetilmiş seviyeler sunar: belirli anomalilere izin verilir, karşılığında eşzamanlılık ve hız kazanılır. Seviye yükseldikçe veri doğruluğu garantisi güçlenir, aynı anda çalışabilen iş miktarı düşer.
Yalıtım seviyeleri hangi anomalileri ele alır?
Seviyeler klasik okuma anomalileri üzerinden tanımlanır:
- Kirli okuma (dirty read): Başka bir işlemin henüz onaylamadığı (commit etmediği) değişikliği okumak. O işlem geri alınırsa okunan veri hiç var olmamış olur.
- Tekrarlanamayan okuma (non-repeatable read): Aynı işlem içinde aynı satırı art arda okuyup farklı değer görmek, çünkü araya başka bir işlem girip değişikliği onaylamıştır.
- Hayalet okuma (phantom read): Aynı koşulla yinelenen bir sorguda, bu arada eklenen ya da silinen satırlar yüzünden farklı bir satır kümesi dönmesi.
Kayıp güncelleme ve yazma sapması (write skew) gibi anomaliler bu başlıkların dışında kalır ve hangi seviyede önlendikleri veritabanı motoruna göre değişir.
Standart seviyeler ve neye izin verdikleri
Okuma anomalilerine göre sıralanan standart seviyeler şunlardır:
- Read Uncommitted: Kirli okumaya izin verir. Veri doğruluğu önemli olan işlerde pratikte nadiren tercih edilir.
- Read Committed: Yalnız onaylanmış veriyi görür. Tekrarlanamayan okuma ve hayalet okuma mümkündür. Birçok motorda varsayılan seviye budur.
- Repeatable Read: İşlem boyunca okunan satırlar aynı kalır. Hayalet okumanın engellenip engellenmediği motora göre farklıdır.
- Serializable: İşlemler sıralı çalışmış gibi sonuç verir. En güçlü ve en maliyetli seviyedir.
Bazı motorlar bunlara ek olarak anlık görüntü (snapshot) yalıtımı sunar; işlem başladığı andaki veri sürümünü görür. Aynı adı taşıyan seviyenin davranışı motordan motora değiştiği için varsayılanı ve garantileri ilgili veritabanının belgesinden kontrol etmek gerekir.
Örnek: aynı hesaptan eşzamanlı para çekme
Örneğin bir bankada aynı hesaptan aynı anda para çekmek isteyen birden çok işlem olsun. Her işlem önce bakiyeyi okuyor, yeterliyse tutarı düşüyor. Düşük yalıtımda tüm işlemler aynı eski bakiyeyi okuyabilir, her biri yeterli bakiye gördüğünü sanıp düşer ve bakiye eksiye iner. Bu bir yarış durumudur.
Çözüm yolları farklı katmanlardadır: • Serializable seviyesi kullanmak; çakışan işlemlerden biri hata alır ve yeniden denenir. • Satırı okurken kilitlemek (SELECT ... FOR UPDATE). • Sürüm sütunuyla iyimser kilitleme: güncelleme yalnız okunan sürüm hâlâ geçerliyse yapılır. • Kontrolü güncellemenin içine almak: UPDATE hesap SET bakiye = bakiye - tutar WHERE id = :id AND bakiye >= tutar.
Son yöntem çoğu zaman en ucuzudur, çünkü kontrol ile yazma tek ifadede, ayrılmaz biçimde gerçekleşir.
Hangi seviyeyi seçmeli?
Seçim iş kuralının hatayı ne kadar kaldırabildiğine bağlıdır. Para hareketi, stok düşme ve kota ayırma gibi 'kontrol et sonra yaz' desenleri sıkı koruma ister. Raporlama sorguları ise çoğunlukla anlık görüntü yalıtımıyla yazıcıları engellemeden tutarlı bir görüntü okuyabilir.
Yaygın hatalar şunlardır: Seviyeyi yükseltip yeniden deneme mantığı yazmamak (Serializable'da çakışma hatası normaldir), işlemleri gereksiz uzun tutmak ve kilit bekleme zincirleri yaratmak, kilitlenmeyi (deadlock) hesaba katmamak.
Dağıtık sistemlerde yalıtım
Replikasyon ve bölümleme (sharding) kullanılan sistemlerde yalıtım yalnız tek sunucu meselesi olmaktan çıkar. Okumalar gecikmeli bir kopyadan yapılırsa, güçlü bir yalıtım seviyesi seçilmiş olsa bile kullanıcı kendi az önce yaptığı değişikliği göremeyebilir. Birden çok bölümü kapsayan işlemler ise koordinasyon maliyeti taşır.
Hangi okumanın güncel, hangisinin gecikmeli olduğunu bilmek tasarımın parçasıdır. Tutarlılıktan kısmen vazgeçen tasarımlar için nihai tutarlılık kavramına bakılır.
Mindset eğitimlerinde nerede işlenir?
Veritabanı İşlem Yönetimi ve İzolasyon Seviyeleri programının modülleri sırasıyla işlem temellerini ve ACID'i, izolasyon seviyelerini ve okuma anomalilerini, kilitleme ile eşzamanlılık kontrolünü ele alır. Ödeme, stok ya da rezervasyon gibi eşzamanlı yazma yoğun sistemler geliştiren backend geliştiricilere ve veritabanı yöneticilerine uygundur.
Replikasyon ve sharding programı dağıtık işlem yönetimini, Google Cloud Spanner programı ise dağıtık ilişkisel veritabanında işlem yönetimini kapsar.
İlgili Mindset programı
Veritabanı İşlem Yönetimi ve İzolasyon Seviyeleri
Sık sorulan sorular
Read Committed ile Repeatable Read arasındaki fark nedir?
Read Committed'de her sorgu, çalıştığı anda onaylanmış en güncel veriyi görür; bu yüzden aynı işlemde aynı satır art arda okunduğunda farklı değer dönebilir. Repeatable Read'de işlem boyunca okunan satırlar sabit kalır. Hayalet satırlara karşı davranış ise motora göre değişir, o yüzden belgeye bakmak gerekir.
Serializable her zaman en güvenli seçim midir?
Doğruluk açısından en güçlü seviyedir, ancak çakışan işlemlerden bazıları hata alıp geri alınabilir ve uygulamanın bunları yeniden denemesi gerekir. Yük altında verim düşebilir. Bu nedenle yalnız gerçekten ihtiyaç duyulan kritik işlemlerde kullanmak ya da koşullu güncelleme gibi daha hafif yöntemlerle desteklemek yaygın bir yaklaşımdır.
Yalıtım seviyesi ile kilitleme aynı şey midir?
Hayır. Yalıtım seviyesi, işlemin hangi garantileri beklediğini söyleyen hedeftir. Kilitleme ve çok sürümlü eşzamanlılık denetimi (MVCC) ise bu hedefe ulaşmak için motorun kullandığı mekanizmalardır. Aynı seviye farklı motorlarda farklı mekanizmalarla sağlanabilir.
Yalıtım seviyesi ACID ile nasıl ilişkilidir?
Yalıtım, ACID kısaltmasındaki I harfidir. ACID tam yalıtımı ideal olarak tanımlar; yalıtım seviyeleri ise bu idealden ne kadar ödün verildiğini adım adım ayarlamanıza izin verir. Atomiklik, tutarlılık ve kalıcılık ise ayrı garantilerdir ve seviye seçiminden bağımsız olarak çalışır.
Kullanıcı kendi yaptığı değişikliği neden göremeyebilir?
Okuma gecikmeli bir replikadan yapılıyorsa, yazma henüz o kopyaya ulaşmamış olabilir. Bu bir yalıtım seviyesi hatası değil, replikasyon gecikmesidir. Çözüm olarak kritik okumaları birincil sunucuya yönlendirmek ya da kendi yazdığını okuma (read-your-writes) garantisi sunan bir yönlendirme kullanılır.