关于脏读与唯一约束

6 篇文章 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条记录


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

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值