Richard__Lee

导航

关于事务隔离级别

数据库事务常见的三种现象:

1 脏读(dirty read):未提交读。(A修改年龄为20,B读出20后,A回滚为18。)

   出现场景:大多数数据库默认的级别为提交读(SQLServer,Orcal),所以除非设置隔离级别为Read uncommitted,否则不会出现。

   解决方案:SET TRANSACTION ISOLATION LEVEL read committed

2 不可重复读:

  出现场景:

  执行事务A后,立马执行事物B,会出现事务A中出现的两次查询值不同。

--事务A

begin tran 
select * from  [HM_Student] where id=8
waitfor delay '00:00:05'
select * from  [HM_Student] where id=8
commit tran 

--事务B

begin tran 
--delete [HM_Student]  where id=6
update [HM_Student] set age=333352 where id=8
waitfor delay '00:00:1'
commit tran 

  解决方案:在事务前加:SET TRANSACTION ISOLATION LEVEL repeatable committed

3 幻读:与第2个相似,是一个事物中多次查询,其他事物对数据进行了删或者增而出现的情况。

  解决方案:SET TRANSACTION ISOLATION LEVEL serializable

 

总结:

隔离级别

脏读

不可重复读取

幻像

说明

未提交读(read uncommitted)

如果其他事务更新,不管是否提交,立即执行

提交读(read committed默认)

读取提交过的数据。如果其他事务更新没提交,则等待

可重复读(repeatable read)

查询期间,不允许其他事务update

可串行读(serializable)

查询期间,不允许其他事务insert或delete

 

posted on 2014-07-18 15:55  Richard__Lee  阅读(249)  评论(0编辑  收藏  举报