NOLOCK veya READ UNCOMMITED transaction isolation level kullanırken şu soruna dikkat etmeniz gerekiyor. Veri birde fazla page'e yazılırsa (page split) durumlarda bir kayıt iki
defa okunacağı için çift kayıt gelebilir veya eksik kayıt gelebilir. Split esnasında veri kısmı okunmuş bir page giderse data eksik okunur
daha önce okunmamış bir page giderse 2. kez okunabilir.
Oracle'da bu tür lock'lar yaşanmadığı için böyle bir hint'e gerek yok.
Bu sorunu gözlemlemek isterseniz alttaki talimatları izleyin. Ben MSSQL 2005 kullandım.
Önce tabloyu yaratın:
CREATE TABLE TestNolock
(
ID UNIQUEIDENTIFIER NOT NULL DEFAULT(NEWID()),
Ad CHAR(2000) NOT NULL DEFAULT('0')
)
Böylece bir page te en fazla 4 kayıt tutulabilecek.
Page split olayını daha kolay simule etmemiz için clustered indexe ihtiyaç var.
CREATE UNIQUE CLUSTERED INDEX IX
_TestNolock_ID ON TestNolock(ID)
Yeni bir bağlantı açalım ve alttaki satırı çalıştıralım. Test bitene kadar sürekli çalışaca
k.
WHILE 1 = 1 INSERT INTO TestNolock DEFAULT VALUES
Başka bir bağlantı açarak alttaki satırları çalıştırslım. Muhtemelen ilk selecten çiftlenmiş kayıtlar dönecektir.
SELECT * INTO #T1 FROM TestNolock WITH(NOLOCK);
SELECT ID,COUNT(*) FROM #T1 GROUP BY
ID HAVING COUNT(*) > 1
SELECT * INTO #T2 FROM TestNolock
SELECT ID FROM #T2 GROUP BY ID HAVING COUNT(*) > 1
Sonuç olarak NOLOCK'a dikkat edelim. Bu hint yerine
READ COMMITTED SNAPSHOT kullanılabilir fakat bu yöntemin de başka performans sorunları olabilir.