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
Yorum Gönder