关闭

关于脏读与唯一约束

标签: 脏读唯一索引重复
231人阅读 评论(0) 收藏 举报
分类:

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


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

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


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

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6281次
    • 积分:266
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章分类