Có, trong một số trường hợp, SQL Server có thể đọc giá trị của một cột từ phiên bản "cũ" của hàng và giá trị của một cột khác từ phiên bản "mới" của hàng.
Thiết lập:
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
Trong kết nối đầu tiên, chạy này:
WHILE ( 1 = 1 )
BEGIN
UPDATE Person
SET Name = 'Jonny2',
Surname = 'Jonny2'
UPDATE Person
SET Name = 'Jonny1',
Surname = 'Jonny1'
END
Trong kết nối thứ hai, chạy này:
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
Sau khi chạy khoảng 30 giây tôi nhận được:
Các SELECT
truy vấn được lấy các cột từ các chỉ số clustered không chứ không phải là nhóm chỉ số (mặc dù do sự gợi ý).
Tuyên bố cập nhật nhận được một kế hoạch cập nhật rộng ...
... và cập nhật các chỉ mục theo trình tự để có thể đọc các giá trị "trước" từ một chỉ mục và "sau" từ chỉ mục kia.
Cũng có thể truy xuất hai phiên bản khác nhau của cùng một giá trị cột.
Trong kết nối đầu tiên, chạy này:
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
Và sau đó trong lần thứ hai, chạy này:
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;
Ngay lập tức, điều này trả lại kết quả sau cho tôi
+------------+------------+
| Left10 | Right10 |
+------------+------------+
| BBBBBBBBBB | AAAAAAAAAA |
+------------+------------+