SQL Server’da Exclusive (X) Lock (Özel Kilit), verinin tutarlılığını sağlamak için kullanılan en katı kilit türüdür. Temel amacı, bir veri kaynağı (satır, sayfa veya tablo) üzerinde bir işlem (transaction) değişiklik yaparken, başka hiçbir işlemin o veriye erişmemesini sağlamaktır.
Exclusive Lock, genellikle Write işlemleri sırasında devreye girer. Bir kaynak üzerinde X kilidi varsa, şu kurallar geçerlidir:
- Tekelcilik: Kaynağı o an elinde tutan işlem dışında hiç kimse veriyi okuyamaz ve değiştiremez.
- Paylaşılamazlık: Diğer kilit türleriyle (Shared, Update vb.) tamamen uyumsuzdur.
- Süre: İşlem (Transaction) tamamlanana (COMMIT veya ROLLBACK) kadar serbest bırakılmaz.
SQL Server, veri değişikliği içeren tüm DML komutlarında otomatik olarak Exclusive Lock kullanır:
- INSERT: Yeni bir satır eklenirken.
- UPDATE: Mevcut bir veri güncellenirken.
- DELETE: Bir veri silinirken.
Exclusive Lock, “bencil” bir kilit türüdür. Aşağıdaki tablo, X kilidinin diğer yaygın kilitlerle ilişkisini özetler:
| Mevcut Kilit | İstenen Kilit (X) | Sonuç |
| Shared (S) | Exclusive (X) | Wait (Bekler) |
| Update (U) | Exclusive (X) | Wait (Bekler) |
| Exclusive (X) | Exclusive (X) | Wait (Bekler) |
SQL Server, performansı optimize etmek için kilidi farklı seviyelerde uygulayabilir. Exclusive Lock şu seviyelerde görülebilir:
- RID / Key (Satır Seviyesi): Sadece ilgili satır kilitlenir.
- PAG (Sayfa Seviyesi): Satırın bulunduğu 8KB’lık sayfa kilitlenir.
- TAB (Tablo Seviyesi): Tüm tablo kilitlenir.
Exclusive Lock, veri bütünlüğü için hayati olsa da yanlış yönetildiğinde şu sorunlara yol açabilir:
- Blocking (Engelleme): Uzun süren bir UPDATE işlemi, o tabloyu okumak isteyen tüm SELECT sorgularını durdurur.
- Deadlock (Ölü Döngü): İki farklı işlemin karşılıklı olarak birbirinin X kilidini beklemesi durumudur. SQL Server birini “kurban” seçerek işlemi iptal eder.
Exclusive Lock (X), yalnızca bir işlem tarafından alınabilir ve bu işlem başka hiçbir işlem tarafından okuma veya yazma işlemi yapılmasını engeller. Yani, bu kilit read-write (okuma ve yazma) işlemleri için engelleyici bir kilittir.
Özetle
Exclusive Lock, “Ben bu veriyi değiştiriyorum, işim bitene kadar kimse ne bakabilir ne de dokunabilir” demektir. Veri güvenliği için mükemmeldir ancak uzun süreli işlemlerle birleştiğinde veritabanında darboğaz yaratabilir.
Şu yapının unutulmaması gerekmektedir. Lock row belirli bir alan, page lock tablo bazında olmaktadır. Güncellenen herhangi bir kolon üzerinde işlem yapılmaz diğer kolonlar üzerinde işlem yapılmaktadır.
Kullanıcı bir işlemi güncelleme işlemi yapmaya çalıştığında:
BEGIN TRAN
UPDATE Musteriler SET Bakiye = 4 WHERE MusteriID =3;
Başka bir kullanıcı ilgili veri satırına select çekiyor.
BEGIN TRAN
Select *from Musteriler where MusteriID=3

With(nolock) ile bu sorun yaşanmaz.

Exclusive lock Shared lock ile uyumsuz olduğu için select ifademiz beklemektedir. Kullanıcı exclusive lock aldığı satır dışında diğer satırların okunması gerçekleşir.


Exclusive lock olan row dışında başka bir satır üzerinde güncelleme işlemi yapılmaktadır.

Exclusive lock’un kapsamı veritabanının kilit alma stratejisine ve sorgunun eriştiği nesneye bağlıdır.
Lock Seviyesi
- Row-Level Lock: Genellikle tek bir satırı kilitler. (Row Identifier – RID)
- Page-Level Lock: Bazen tüm sayfayı kilitler (Birden fazla satır etkilenebilir).
- Table-Level Lock: Eğer SQL Server kilit yükseltme (Lock Escalation) yaparsa, tüm tabloyu kilitleyebilir.
- Database-Level Lock: Çok nadiren olur, genellikle offline işlemler sırasında.
Örneğin, UPDATE veya DELETE sorgusu sadece bir satırı etkiliyorsa, yalnızca o satır (RID) kilitlenir. Eğer SQL Server kilit yükseltme (Lock Escalation) yaparsa, tüm tabloyu kilitleyebilir. Örneğin, UPDATE işlemi çok fazla satırı değiştirirse, SQL Server tek tek satırları kilitlemek yerine tablo seviyesinde (Table-Level Lock) bir X Lock alabilir.
Kilitleme eşiği: SQL Server genellikle 5000’den fazla satır değiştirildiğinde lock escalation (kilit yükseltme) yapar ve tüm tabloyu kilitler.
Eğer aynı sayfadaki birçok satır siliniyorsa, SQL Server Page-Level Lock kullanabilir. Bazen bu lock, tüm tabloya yükseltilebilir.
Exclusive Lock (X), o satır üzerinde tam erişim sağlar. Yani, satır sadece bu işlem tarafından güncellenebilir ve başkası ne okuyabilir ne de yazabilir. Bu kilit, satıra tam sahiplik sağlar ve bu nedenle, aynı satır üzerinde başka bir işlem tarafından herhangi bir okuma veya yazma işlemi yapılmasına izin vermez.
UPDATE Sales.SalesOrderDetail SET OrderQty = 15 WHERE OrderQty = 10;
Güncelleme sırasında satıra Exclusive Lock koyulur, başka işlemler bekler. Sadece With(NOLOCK) olan select cümleleri bu kilidi görmezden gelerek(dirty read) yaparak veriye erişebilmektedir. Sorgunun with(nolock ) ile Read Uncommitted gibi çalışmasını sağlayan bir yapısı vardır.
Başka makalede görüşmek dileğiyle..
“De ki: Ey Rabbim! İlmimi artır.” Taha-114
