Ana içeriğe atla

NOLOCK, READPAST ve READUNCOMMITED

MS SQL’de NOLOCK, READPAST ve READUNCOMMITED komutları ve kullanımı

NOLOCK: Kendisi üzerinde değişiklik yapılan tabloda, yapılan değişiklikler henüz tamamlanmamış da olsa(TRANSACTION sonlandırılmamış da olsa). İlgili kayıtlar sanki işlemler tamamlanmış gibi elde edilebilir.

READPAST: Tabloda yapılan değişiklikler göz önünde bulundurulur ancak sadece üzerinde TRANSACTION sürecinde kilit bulunmayan kayıtlar elde edilebilir. Tüm kayıtların elde edilebilmesi için başlatılan TRANSACTION sürecinin sonlandırılmış olması yani sql deyimi ile COMMIT edilmiş olması gerekmektedir.

READUNCOMMITED: NOLOCK ile aynı özelliklere sahiptir.
 
CREATE TABLE Table_1
(
      ID        INTEGER IDENTITY(1, 1) NOT NULL,
      ACIKLAMA  VARCHAR(100) NULL
)
 
GO
 
 
CREATE TABLE Table_2
(
      ID        INTEGER IDENTITY(1, 1) NOT NULL,
      ACIKLAMA  VARCHAR(100) NULL
)
 
GO
 
CREATE VIEW View_1
AS
SELECT * FROM Table_1 T1
UNION ALL
SELECT * FROM Table_2 T2
 
GO
 
CREATE VIEW View_2
AS
SELECT * FROM View_1 V1
UNION ALL
SELECT * FROM Table_2 T1
 
GO
--1. Tabloya test için eklenen kayıtlar
INSERT INTO Table_1(ACIKLAMA) VALUES('A1')
INSERT INTO Table_1(ACIKLAMA) VALUES('A2')
INSERT INTO Table_1(ACIKLAMA) VALUES('A3')
INSERT INTO Table_1(ACIKLAMA) VALUES('A4')
 
GO
--2. Tabloya test için eklenen kayıtlar
INSERT INTO Table_2(ACIKLAMA) VALUES('B1')
INSERT INTO Table_2(ACIKLAMA) VALUES('B2')
INSERT INTO Table_2(ACIKLAMA) VALUES('B3')
 
GO
 
--Transaction başlatılır ve 1. Tablo üzerinde yeni kayıt ekleme ve güncelleme işlemlerinin yapılması sayesinde tablonun kilitlenmesi(LOCK) sağlanır.
 
BEGIN TRAN
 
INSERT INTO Table_1(ACIKLAMA) VALUES('A5')
 
UPDATE Table_1 SET ACIKLAMA = 'A2_2' WHERE  ID = 2
 
 
SELECT * FROM   View_1 à Test1 tablosunda lock(kilit) olduğu için sonuç dönmeyecek 
 
SELECT * FROM   View_1(NOLOCK) à View'ın içerisindeki tablolar için de TRANSACTION ISOLATION LEVEL değerini READ COMMITTED olarak değiştirileceği için sonuç gelecektir. Gelen sonuç INSERT ve UPDATE işlemleri gerçekleştirilmiş gibi hesaplanır.
 
SELECT * FROM   View_1(READPAST) à READPAST komutu ile tablodaki görüntülemek istediğinizde üzerinde değişiklik yapılmakta olan ve TRANSACTION işlemi henüz onaylanmamış olan kayıtlar listelenmeyecektir. Dikkat edilirse 1. Tablodaki ID değeri 2 olan kayıt güncellenmeye çalışılmaktadır ve AÇIKLAMA alanı A5 olarak kaydedilmeye çalışılan kayıt üzerinde de henüz onaylanmadığı(COMMIT) için ve kilit(LOCK) bulunduğu için listelenmeyecektir.
 

Yorumlar

Bu blogdaki popüler yayınlar

HAKKIMDA

Yaklaşık 10 yıldır yazılım sektöründeyim. Kod yazarken kaynakları okuyup anlayıp sentezleyip dönüştürüp  kullanıyorsunuz. Ben de bu blog da hakkında bilgi sahibi olduğum , temiz ve net anlatımlı makalelere yer vereceğim. Kaynak kısmında aldığım linkler yer almaktadır. Ziyaret ettiğiniz için teşekkür ederim. Semra Özbakır

SQL Syntaxları

SQL Syntaxları Select: SELECT kolon[lar], … n FROM tablo[lar] Where: SELECT kolon[lar] FROM tablo[lar] WHERE [kosul] INNER JOIN: SELECT secim listesi FROM ilk_tablo [takma ad] birleştirme_tipi ikinci tablo[takma_ad] [ON birlestirme_kosulu] LIKE: SELECT kolon_adi FROM tablo_adi WHERE kolon_adi LIKE {kalıp} And/Or: SELECT kolon_adi FROM tablo_adi WHERE koşul {[AND|OR] “koşul”}+ In: SELECT kolon_adi FROM tablo_adi WHERE kolon_adi IN (‘değer1’, ‘değer2’, …) Between: SELECT kolon_adi FROM kolon_adi BETWEEN ‘değer1’ AND ‘değer2’ SUM: Select SUM(sutun_adi) from tablo_adi AVG: Select AVG(sutun_adi) from tablo_adi MAX: Select MAX(sutun_adi) from tablo_adi MIN: Select MIN(sutun_adi) from tablo_adi COUNT: Select COUNT(sutun_adi) from tablo_adi Group By: Select sütun from Tablo(lar) where sart(lar) group by sütun Having: Select sütun, FONKSIYON_ADI(sutun_adi) from Tablo(lar) where sart(lar) group by sütun having grup_kisitlamasi INSERT...