MSSQL Server Isolation Level Nedir

SQL Server’da Isolation Level (İzolasyon Seviyesi), birden fazla işlemin (transaction) aynı anda çalışırken birbirini nasıl etkileyebileceğini belirleyen bir ayardır. İzolasyon seviyeleri, kirli okuma (dirty read), tekrar eden okuma hatası (non-repeatable read) ve hayalet okuma (phantom read) gibi durumları önlemek veya azaltmak için kullanılır. Isolation level yapısına geçmeden önce commit işlemini değinelim.

SQL Server’da COMMIT işlemi, bir transaction içinde yapılan değişiklikleri kalıcı hale getirir. Bir transaction içinde yapılan değişiklikler COMMIT edilene kadar geçici olarak veritabanında tutulur ve diğer oturumlar bu değişiklikleri göremez.  Eğer COMMIT yapılmazsa ve işlem ROLLBACK edilirse, değişiklikler iptal edilir ve veritabanı işlem başlamadan önceki haline geri döner.

COMMIT İşleminin Mantığı

  • BEGIN TRANSACTION → Transaction başlatılır.
  • UPDATE / INSERT / DELETE gibi işlemler yapılır.
  • COMMIT → Değişiklikler kalıcı olur ve diğer oturumlar görebilir.
  • ROLLBACK (opsiyonel) → Eğer işlem iptal edilirse, değişiklikler geri alınır.

Daha detaylı açıklamak gerekirse:

SQL Server’da bir transaction COMMIT edildiğinde, aşağıdaki adımlarla veri kalıcı (persistent) hale gelir:

1. Transaction Log (WAL – Write Ahead Log)

  • İlk olarak, yapılan tüm değişiklikler (INSERT, UPDATE, DELETE…) Transaction Log dosyasına (*.ldf) yazılır.
  • Bu işlem, COMMIT olmadan önce bile gerçekleşir.
  • Bu log, “ne zaman ne değişti” bilgisini tutar.

2. COMMIT ne yapar?

  • COMMIT TRANSACTION komutu verildiğinde, SQL Server:
  • Transaction Log’daki girişleri “kalıcı” olarak işaretler.
  • Gerekirse Checkpoint mekanizması tetiklenir veya daha sonra çalışır.
  • Bu işlem ile veri kaybına karşı koruma sağlanır (örneğin elektrik kesilirse transaction log üzerinden geri yükleme yapılabilir).

3. Veri Sayfalara (Data Pages) yazılır (Buffer Pool üzerinden)

  • COMMIT işleminden sonra, değişen veri hala bellekte (buffer pool) tutulabilir.
  • SQL Server bir süre sonra bu veriyi veritabanı veri dosyasına (*.mdf) yazar.
  • Bu işlem immediate (anlık) olmak zorunda değildir. Çünkü transaction log zaten güvenliğe alınmıştır.

Ne Zamana Kadar Kirli Veri Olarak Kalır
COMMIT edilene kadar transaction içindeki değişiklikler kirli veri olarak kalır. Başka oturumlar bu veriyi sadece READ UNCOMMITTED seviyesinde okuyabilir. COMMIT yapıldığında, tüm oturumlar veriyi görebilir. ROLLBACK yapılırsa, değişiklikler tamamen iptal edilir ve eski veri korunur.

1. Isolation Level Çeşitleri 

Isolation Level        Dirty ReadNon-Repeatable ReadPhantom Read
READ UNCOMMITTED  VarVarVar
READ COMMITTED    YokVarVar
REPEATABLE READ   YokYokVar
SERIALIZABLE  YokYokYok
SNAPSHOTYokYokYok

Dirty Read: Bir transaction, başka bir transaction tarafından henüz commit edilmemiş verileri okursa kirli okuma olur.  Veri rollback olursa transaction tarafından okunan veri geçerli olmayan veri olacaktır. Bu yüzden dirty read olarak adlandırılır.
Non-Repeatable Read: Aynı transaction içinde bir veri iki kez okunursa ve arada başka bir transaction o veriyi değiştirirse tekrar eden okuma hatası oluşur. 
Phantom Read: Bir transaction belirli bir koşula göre veri okuduğunda, başka bir transaction yeni bir kayıt ekleyip commit ederse hayalet okuma olur. 


 Sonuç ve Karşılaştırma

SeviyeAvantajıDezavantajı
READ UNCOMMITTEDÇok hızlıKirli veri okuyabilir
READ COMMITTEDVarsayılan seviye, kirli okuma yokNon-repeatable read ve phantom read var
REPEATABLE READNon-repeatable read yokPhantom read var
SERIALIZABLETam izolasyonPerformans çok düşer
SNAPSHOTOkuma işlemleri bloklanmazEkstra tempdb alanı kullanır

Eğer hız ve esneklik önemliyse, READ COMMITTED veya SNAPSHOT tercih edilebilir. Ancak tam güvenlik gerekiyorsa, SERIALIZABLE kullanılmalıdır.

Not: SQL Server’da isolation level‘i genel (global) olarak değiştiremezsin çünkü isolation level, session (oturum) bazlı çalışır. Yani her bağlantı kendi isolation level’ini ayarlamak zorundadır. Yukarıdaki her bölümde vermiş olduğum kodların başlangıç olarak eklenebilir. Ayrıca SSMS arayüzünden Query>Query Options kısmında bulanan advanced sekmesinde gerekli olan ayarlamalar yapılabilir.

Aşağıdaki komutla default olan isolation level öğrenilir.

dbcc useroptions

Başka bir makalede görüşmek dileğiyle.. Kolay gelsin.

“Yürüyüşünde ölçülü ol, sesini yükseltme; çünkü seslerin en çirkini eşeğin ­anırmasıdır.”Lokman-19





Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir