Ana içeriğe geç

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.

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/isolation-level

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

Bir transaction'ı en katı düzeyde çalıştırmak (PostgreSQL sözdizimi)sql
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

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar