首页 > 代码库 > 关于事务隔离级别
关于事务隔离级别
数据库事务常见的三种现象:
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
|
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。