MSSQL2008R2 设置事务隔离级别为可重复读时的疑虑与陷阱?


场景描述一:

1.在会话1中执行下面的语句后,马上操作第2步

IF OBJECT_ID('tb_REPEATABLE_READ','U') IS NOT NULL 
DROP TABLE tb_REPEATABLE_READ
go 
CREATE TABLE tb_REPEATABLE_READ --创建表,为堆表,且无任何索引
( xh INT  ,col INT )
go
INSERT INTO tb_REPEATABLE_READ  --写入一行数据
SELECT 1 ,1
go 

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ --设置为可重复读
BEGIN TRAN
DELETE FROM tb_REPEATABLE_READ --删除刚才写入的数据
WHERE xh = 1;

WAITFOR DELAY '00:00:10' --等待10秒钟,以便会话2有时间进行操作

SELECT * FROM tb_REPEATABLE_READ -- 事务内进行读取
COMMIT TRAN 
2.在会话2中执行下面的语句

INSERT INTO tb_REPEATABLE_READ 
SELECT 1 ,1

3.返回会话1,等待结果出现: 1行记录



场景描述二:

1.在会话1中执行下面的语句后,马上操作第2步

USE TestCangChu
go 
IF OBJECT_ID('tb_REPEATABLE_READ','U') IS NOT NULL 
DROP TABLE tb_REPEATABLE_READ
go 
CREATE TABLE tb_REPEATABLE_READ --创建表,xh 列为聚集主键
( xh INT PRIMARY KEY   ,col INT )
go
INSERT INTO tb_REPEATABLE_READ  --写入一行数据
SELECT 1 ,1
go 
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ --设置为可重复读
BEGIN TRAN
DELETE FROM tb_REPEATABLE_READ --删除刚才写入的数据
WHERE xh = 1;
WAITFOR DELAY '00:00:10' --等待10秒钟,以便会话2有时间进行操作
SELECT * FROM tb_REPEATABLE_READ -- 事务内进行读取
COMMIT TRAN 

2.在会话2中执行下面的语句

INSERT INTO tb_REPEATABLE_READ 
SELECT 1 ,1

3.返回会话1,等待结果出现:0行记录 




场景一二对比结论:

存在聚集主键情况下,符合我们一般对可重复读事务隔离级别的预期。而堆表中,恰与我们预期相反,与读已提交无异。


各位不妨谈谈自己的观点......






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值