数据库事务常见的三种现象:
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
|
原文:http://www.cnblogs.com/lpfsky/p/3853707.html