Merhabalar,
Sql server da yaptığımız bazı işlemler sırasında kullandığımız tabloları kilitlememiz gerekebilir. Yada kilitli bir tablodan kilidin açılmasını beklemeden sorgu çekmek isteyebiliriz. Bu gibi durumlar için kullanabileceğimiz sql server locking hint leri aşağıdaki gibidir;
HOLDLOCK = Kilitlenme işleminin transaction bitimine kadar sürmesini sağlar. Tablock gibi bazı ifadeler sadece statement bazında kilitleme yapmaktadır. Bunların transaction bazında kilitleme yapması isteniyorsa HOLDLOCK ifadesiyle beraber kullanılması gerekmektedir. HOLDLOCK, SERIALIZABLE ile aynı işi yapmaktadır.
NOLOCK = Kilitli bir tablodan kilidin açılmasını beklemeden kayıt çekmeye yarar. Kirli kayıt (dirty read) alınması mümkündür. Kullanımı Select * from TableName WITH (NOLOCK) şeklindedir. NOLOCK, READUNCOMMITTED ile aynı işi yapmaktadır.
PAGELOCK = Sayfa bazında kilitleme yapmak için kullanılır.
READCOMMITTED = Kilitli tabloları kullanabilmek için kilidinin açılmasını bekler. SQL Server default udur.
READUNCOMMITTED = NoLock ile aynı işi yapar.
ROWLOCK = Kayıt bazında kilitleme yapmak için kullanılır.
SERIALIZABLE = HoldLock ile aynı işi yapar.
TABLOCK = Tablock ile lock edilen tablolarda read işlemi yapılabilirken insert ve update işlemi yapılamamaktadır. Ayrıca transaction boyutunda çalışabilmesi için holdlock ifadesi ile beraber kullanılması gerekmektedir.
TABLOCKX = Tablockx in tablock dan farkı read işleminide izin vermemesidir. Ayrıca transaction bazında çalışabilmekte dolayısıyla ekstradan holdlock ifadesine gerek kalmamaktadır.
UPDLOCK = Updlock ile locklanmış tablo larda select ve insert işlemleri yapılabilirken, update işlemi yapılamamaktadır. Statement ve transaction bazında çalışır. Transaction bazında çalışması için ayrıca HOLDLOCK ifadesine gerek yoktur.
XLOCK = Tablockx gibidir. Farkı statement da ki bütün işlemlerin bitmesini bekler. En kapsamlı lock işlemidir.
Sistemde bulunan kilitli tablolar EXEC sp_lock komutuyla görüntülenebilir.