场景描述一:
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行记录
场景一二对比结论:
存在聚集主键情况下,符合我们一般对可重复读事务隔离级别的预期。而堆表中,恰与我们预期相反,与读已提交无异。
各位不妨谈谈自己的观点......