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 Read | Non-Repeatable Read | Phantom Read |
| READ UNCOMMITTED | Var | Var | Var |
| READ COMMITTED | Yok | Var | Var |
| REPEATABLE READ | Yok | Yok | Var |
| SERIALIZABLE | Yok | Yok | Yok |
| SNAPSHOT | Yok | Yok | Yok |
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
| Seviye | Avantajı | Dezavantajı |
| READ UNCOMMITTED | Çok hızlı | Kirli veri okuyabilir |
| READ COMMITTED | Varsayılan seviye, kirli okuma yok | Non-repeatable read ve phantom read var |
| REPEATABLE READ | Non-repeatable read yok | Phantom read var |
| SERIALIZABLE | Tam izolasyon | Performans çok düşer |
| SNAPSHOT | Okuma işlemleri bloklanmaz | Ekstra 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
