关于脏读与唯一约束

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条记录


按此推理,数据写入过程:

写数据内存页->写索引内存页,若唯一索引重复,报错,就回滚数据内存页->写日志文件


感觉这处理得有点怪怪的。是不是该先检查数据正确(无违反唯一索引及其他约束等),再行写入?

阅读更多
个人分类: DBA SQL
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭