SQL Server’da Schema Locks (Şema Kilitleri), bir veri tabanı nesnesinin (tablo, view, index vb.) yapısı üzerinde bir işlem yapılırken, bu yapının başka bir işlem tarafından değiştirilmesini veya silinmesini engellemek için kullanılır.
Temelde iki ana türü vardır: Sch-S ve Sch-M.
1. Sch-S: Schema Stability (Şema Kararlılığı) Lock
Bu kilit türü, SQL Server bir sorguyu derlerken veya çalıştırırken kullanılır. “Ben bu tabloyu okuyorum, ben bitirene kadar sakın yapısını değiştirme” mesajıdır.
- Herhangi bir SELECT, INSERT, UPDATE veya DELETE işlemi sırasında oluşmaktadır.
- Veri okunurken veya yazılırken, bir başkasının ALTER TABLE veya DROP TABLE komutuyla tablo yapısını değiştirmesini engellemektir.
- Diğer tüm işlemlere (Sch-S dahil) izin verir, ancak Sch-M ile çakışır.
2. Sch-M: Schema Modification (Şema Değişikliği) Lock
Bu kilit türü, bir nesnenin yapısı üzerinde fiziksel bir değişiklik yapılacağı zaman kullanılır. En yüksek kilit seviyelerinden biridir.
- ALTER TABLE, CREATE INDEX, TRUNCATE TABLE veya DROP TABLE gibi DDL (Data Definition Language) komutları sırasında oluşmaktadır.
- Tablo yapısı değişirken hiçbir sorgunun bu tabloya erişmemesini garanti etmektedir.
- Hiçbir şeyle uyumlu değildir. Bir tabloda Sch-M kilidi varken başka kimse o tablodan veri okuyamaz veya veri yazamaz.
Karşılaştırma Tablosu
| Özellik | Sch-S (Stability) | Sch-M (Modification) |
| İşlem Tipi | DML (Select, Update vb.) | DDL (Alter, Drop vb.) |
| Kritiklik | Düşük (Paylaşımlı) | Yüksek (Özel/Exclusive) |
| Okumayı Engeller mi? | Hayır | Evet |
| Yazmayı Engeller mi? | Hayır (Satır kilidi yoksa) | Evet |
Eğer uzun süren bir SELECT sorgunuz varsa, tablo üzerinde bir Sch-S kilidi tutar. Bu sırada siz aynı tabloya yeni bir kolon eklemek (ALTER TABLE) isterseniz, SQL Server bir Sch-M kilidi talep eder.
Ancak Sch-M, Sch-S ile uyumlu olmadığı için ALTER TABLE işlemi beklemeye başlar (Blocking). Daha da kötüsü, bu ALTER TABLE beklerken arkasından gelen tüm basit SELECT sorguları da kuyruğa girer ve sistem kilitlenebilir.
Not: NOLOCK (Read Uncommitted) ipucu kullanmak, veri kilitlerini (Shared Lock) engeller ancak Sch-S kilidini engellemez. Şema kararlılığı her zaman korunur.
Şu anki aktif şema kilitlerini görmek için aşağıdaki sorguyu kullanabilirsiniz:
SELECT
resource_type,
request_mode,
request_status,
OBJECT_NAME(resource_associated_entity_id) AS TableName
FROM sys.dm_tran_locks
WHERE resource_type = 'OBJECT';
Aşağıdaki komut ile bir tablo üzerinde değişiklik yapıldığında beklenen kilidi aldığı görülmektedir.
ALTER TABLE Musteriler alter column Ad NVARCHAR(100);

Aşağıdaki komut sayesinde anlık gelen sorgularımızdaki kilit durumlarını görebiliriz.
SELECT
session_id AS SessionID,
blocking_session_id AS BlockingSessionID,
wait_type AS WaitType,
wait_time AS WaitTime,
wait_resource AS WaitResource
FROM
sys.dm_exec_requests
WHERE
blocking_session_id > 0;

Bir başka komut ise:

Sp_whoIsactive ekranındada ilgili kilitlenmeleri görebiliriz.

Veritabanımızın üzerindeki lock’ları aşağıdaki uzantıda görebiliriz.

Başka makalede görüşmek dileğiyle..
Ey iman edenler, sabırla ve namazla yardım dileyin. Gerçekten Allah, sabredenlerle beraberdir. Bakara Suresi, 153. Ayet
