SQL Server 2012
案例:
Create Table dbo.Test
(ID INT Identity,Num INT,UqNo INT);
Alter Table Test Add Constraint PK_Test Primary Key (ID);
Create Unique Index IX_Test_UqNo On Test (UqNo);
Process 1:
Insert dbo.Test (Num,UqNo) Values (100,100);
Insert dbo.Test (Num,UqNo) Values (100,100); --因为UqNo重复,所以最终是要报错的
Process 2:
Select * From dbo.Test WITH (NOLOCK) Where Num=100; --可能得到2条记录
若 Process 2在 Process 1的第2个SQL发出后,且在其因为唯一索引约束报错前执行,
则会得到2条记录。比如Process 1的第2个SQL是 00:00:00.100 毫秒执行,在00:00:00.500毫秒报错,
当Process 2在 00:00:00.200毫秒执行,就能查询出2条记录
按此推理,数据写入过程:
写数据内存页->写索引内存页,若唯一索引重复,报错,就回滚数据内存页->写日志文件
感觉这处理得有点怪怪的。是不是该先检查数据正确(无违反唯一索引及其他约束等),再行写入?