Evet, SQL Server bazı durumlarda satırın "eski" sürümünden bir sütunun değerini ve satırın "yeni" sürümünden başka bir sütunun değerini okuyabilir.
Kurmak:
CREATE TABLE Person
(
Id INT PRIMARY KEY,
Name VARCHAR(100),
Surname VARCHAR(100)
);
CREATE INDEX ix_Name
ON Person(Name);
CREATE INDEX ix_Surname
ON Person(Surname);
INSERT INTO Person
SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY @@SPID),
'Jonny1',
'Jonny1'
FROM master..spt_values v1,
master..spt_values v2
İlk bağlantıda şunu çalıştırın:
WHILE ( 1 = 1 )
BEGIN
UPDATE Person
SET Name = 'Jonny2',
Surname = 'Jonny2'
UPDATE Person
SET Name = 'Jonny1',
Surname = 'Jonny1'
END
İkinci bağlantıda şunu çalıştırın:
DECLARE @Person TABLE (
Id INT PRIMARY KEY,
Name VARCHAR(100),
Surname VARCHAR(100));
SELECT 'Setting intial Rowcount'
WHERE 1 = 0
WHILE @@ROWCOUNT = 0
INSERT INTO @Person
SELECT Id,
Name,
Surname
FROM Person WITH(NOLOCK, INDEX = ix_Name, INDEX = ix_Surname)
WHERE Id > 30
AND Name <> Surname
SELECT *
FROM @Person
Yaklaşık 30 saniye koştuktan sonra şunu elde ederim:
SELECT
Sorgu olmayan kümelenmiş endeksler yerine (ipuçları nedeniyle de olsa) kümelenmiş dizin sütunları alınırken edilir.
Güncelleme bildirimi geniş bir güncelleme planı alır ...
... ve dizinleri sırayla günceller, böylece bir dizinden "önce" ve diğerinden "sonra" değerleri okunabilir.
Aynı sütun değerinin iki farklı versiyonunu almak da mümkündür.
İlk bağlantıda şunu çalıştırın:
DECLARE @A VARCHAR(MAX) = 'A';
DECLARE @B VARCHAR(MAX) = 'B';
SELECT @A = REPLICATE(@A, 200000),
@B = REPLICATE(@B, 200000);
CREATE TABLE T
(
V VARCHAR(MAX) NULL
);
INSERT INTO T
VALUES (@B);
WHILE 1 = 1
BEGIN
UPDATE T
SET V = @A;
UPDATE T
SET V = @B;
END
Ve sonra ikincisinde şunu çalıştırın:
SELECT 'Setting intial Rowcount'
WHERE 1 = 0;
WHILE @@ROWCOUNT = 0
SELECT LEFT(V, 10) AS Left10,
RIGHT(V, 10) AS Right10
FROM T WITH (NOLOCK)
WHERE LEFT(V, 10) <> RIGHT(V, 10);
DROP TABLE T;
Hemen, bu benim için aşağıdaki sonucu döndürdü
+------------+------------+
| Left10 | Right10 |
+------------+------------+
| BBBBBBBBBB | AAAAAAAAAA |
+------------+------------+