Ya, SQL Server dapat, dalam beberapa keadaan membaca nilai satu kolom dari versi "lama" dari baris, dan nilai kolom lain dari versi "baru" dari baris.
Mempersiapkan:
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
Di koneksi pertama, jalankan ini:
WHILE ( 1 = 1 )
BEGIN
UPDATE Person
SET Name = 'Jonny2',
Surname = 'Jonny2'
UPDATE Person
SET Name = 'Jonny1',
Surname = 'Jonny1'
END
Di koneksi kedua, jalankan ini:
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
Setelah berjalan sekitar 30 detik saya mendapatkan:
The SELECT
query mengambil kolom dari indeks berkerumun non daripada indeks berkerumun (meskipun karena petunjuk).
Pernyataan pembaruan mendapat paket pembaruan yang luas ...
... dan memperbarui indeks secara berurutan sehingga dimungkinkan untuk membaca nilai "sebelum" dari satu indeks dan "setelah" dari yang lain.
Dimungkinkan juga untuk mengambil dua versi berbeda dari nilai kolom yang sama.
Di koneksi pertama, jalankan ini:
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
Dan kemudian di yang kedua, jalankan ini:
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;
Segera, ini mengembalikan hasil berikut untuk saya
+------------+------------+
| Left10 | Right10 |
+------------+------------+
| BBBBBBBBBB | AAAAAAAAAA |
+------------+------------+