首页 > 代码库 > 关于事务隔离级别

关于事务隔离级别

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

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

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

   解决方案:SET TRANSACTION ISOLATION LEVEL read committed

2 不可重复读:

  出现场景:

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

--事务Abegin tran select * from  [HM_Student] where id=8waitfor delay ‘00:00:05‘select * from  [HM_Student] where id=8commit tran --事务Bbegin tran --delete [HM_Student]  where id=6update [HM_Student] set age=333352 where id=8waitfor 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