`
sjk2013
  • 浏览: 2166335 次
文章分类
社区版块
存档分类
最新评论

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




场景一二对比结论:

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


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






分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics