Yalıtım Düzeyi
- İngilizcesi
- Isolation Level
- Türkçe karşılığı
- izolasyon seviyesi, yalıtım seviyesi
- Okunuşu
- aysıleyşın levıl
Günlük kullanımda iki ad da yaygın.
Kısaca
Yalıtım düzeyi, eşzamanlı transaction'ların birbirinin değişikliklerini ne kadar görebileceğini belirleyen ve katılıkla hızı dengeleyen veritabanı ayarıdır.
Transaction yalıtım düzeyi (isolation level) nedir?
Yalıtım (isolation), ACID'deki I'dır ve yalıtım düzeyi, veritabanının eşzamanlı transaction'ların birbirini etkilemesini ne kadar katı biçimde önleyeceğine karar verir. SQL standardı en zayıftan en güçlüye dört düzey tanımlar: Read Uncommitted, Read Committed, Repeatable Read ve Serializable. Genellikle veritabanı için bir varsayılan belirleyebilir ve tek bir transaction için bunu geçersiz kılabilirsiniz.
Her düzey, önlediği anomalilerle tanımlanır. Kirli okuma (dirty read), başka bir transaction'ın değişikliklerini onaylanmadan önce görmek demektir; tekrarlanamayan okuma (non-repeatable read), aynı satırı iki kez okuyup araya giren başka birinin onaylaması yüzünden farklı değerler almak demektir; hayalet okuma (phantom read) ise bir aralık sorgusunu yeniden çalıştırıp yeni satırlar bulmak demektir. Read Committed kirli okumaları önler, Repeatable Read tekrarlanamayan okumaları da önler ve Serializable, sonucu transaction'lar teker teker çalışmış gibi aynı yapar. Veritabanları bunu kilitler ya da her transaction'a verinin tutarlı bir anlık görüntüsünü sunan çok sürümlü eşzamanlılık denetimi (MVCC) ile uygular; kesin garantiler veritabanları arasında değişir, bu yüzden veritabanınızın belgelerine bakın.
Benzetme olarak birkaç kişinin düzenlediği paylaşımlı bir doküman düşünün. En düşük düzeyde diğer insanların yarım yazılmış cümlelerini görebilirsiniz; en yüksek düzeyde herkes sırayla, her biri tek başına düzenliyormuş gibidir. Daha katı düzeyler daha az sürpriz getirir ama daha fazla bekleme, engellenme ya da serileştirme hatasıyla başarısız olan ve yeniden denenmesi gereken transaction getirir.
Yalıtım düzeyleri çoğu zaman nihai tutarlılık gibi tutarlılık modelleriyle karıştırılır. Yalıtım düzeyleri, transaction'ların tek bir veritabanı içinde nasıl etkileştiğini; tutarlılık modelleri ise farklı sunuculardaki kopyaların nasıl uzlaştığını tarif eder. Ayrıca açık kilitlemeyle de aynı değildirler: yalıtım düzeyi varsayılan garantileri belirler; SELECT ... FOR UPDATE veya iyimser kilitleme gibi araçlar ise daha düşük düzeylerde kayıp güncellemeleri önlemek gibi belirli işlemleri korur.
Önemli noktalar
- Standart düzeyler Read Uncommitted, Read Committed, Repeatable Read ve Serializable'dır.
- Yüksek düzeyler daha fazla anomaliyi önler: kirli okumalar, tekrarlanamayan okumalar ve hayalet okumalar.
- Serializable, transaction'lar birbiri ardına çalışmış gibi davranır.
- Daha katı düzeyler daha fazla bekleme ve çakışmalardan sonra daha fazla yeniden deneme maliyeti getirir.
- Varsayılanlar veritabanları arasında farklıdır; hangisini kullandığınızı kontrol edin.
Örnek
BEGIN ISOLATION LEVEL SERIALIZABLE;
SELECT balance FROM accounts WHERE id = 1;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
-- If a concurrent transaction conflicts, a statement or the COMMIT
-- fails with a serialization error, and the application should retry.
-- Check the current default level
SHOW default_transaction_isolation;Sık sorulan sorular
Varsayılan yalıtım düzeyi nedir?
Veritabanına bağlıdır. PostgreSQL, Oracle ve SQL Server varsayılan olarak Read Committed kullanır; InnoDB motorlu MySQL ise varsayılan olarak Repeatable Read kullanır.
Kirli okuma (dirty read) nedir?
Kirli okuma, bir transaction'ın başka bir transaction'ın değiştirdiği ancak henüz onaylamadığı veriyi okumasıyla olur. O diğer transaction geri alınırsa ilk transaction hiç resmi olarak var olmamış veriyi kullanmış olur.
Neden her zaman Serializable kullanmayalım?
Serializable en güçlü garantileri verir ancak verimi düşürebilir; çünkü transaction'lar birbirini bekler ya da iptal edilir ve yeniden denenmesi gerekir. Birçok uygulama Read Committed kullanır ve bir yarış durumunun (race condition) önemli olduğu yerlere hedefli kilitleme ekler.
İlgili sayfalar
- TransactionVeritabanları, s. 36Transaction, tek bir bütün olarak başarılı ya da başarısız olan veritabanı işlemleri grubudur; böylece veri asla yarım kalmış, tutarsız bir durumda bırakılmaz.
- ACIDVeritabanları, s. 1ACID; atomiklik, tutarlılık, yalıtım ve dayanıklılıktan oluşan, hata ya da çökme olsa bile veritabanı transaction'larını güvenilir tutan dört garantidir.
- İyimser KilitlemeVeritabanları, s. 15İyimser kilitleme, transaction'ları kilit tutmadan ilerleten ve çakışmaları kayıt anında sürüm numarasına bakarak yakalayan bir eşzamanlılık tekniğidir.
- Race Conditionİşletim Sistemleri, s. 24Race condition, programın sonucunun paylaşılan veriyi aynı anda kullanan thread, process veya isteklerin öngörülemeyen zamanlamasına bağlı olduğu hatadır.
- Deadlockİşletim Sistemleri, s. 7Deadlock, iki ya da daha fazla thread veya process'in kaynakları bırakmaları için birbirini sonsuza dek beklediği ve hiçbirinin ilerleyemediği durumdur.
- Nihai TutarlılıkVeritabanları, s. 20Nihai tutarlılık, yeni güncelleme yapılmazsa dağıtık bir sistemdeki bir verinin tüm kopyalarının zamanla özdeş hale geleceğine dair bir garantidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin