打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
隔离性与脏读、幻读、不可重复读的理解
读取的问题
脏读:读取到了未提交的数据
不可重复读:一个事务,两次读取到的数据不同。注意,这里不同是指两次读取到的记录主键一样,但是其中的内容不一样
幻读:一个事务,两次读取到的数据记录不同。注意,这里的要点是,读取到了之前没读取到的记录,或者之前读取的记录,本次读取没有获取到。
这些问题都是在并发访问下出现的,如何更好理解这几个问题呢?
在一个事务A进行数据库操作时,另外的事务B可能进行一些操作:
B修改、新增了数据,但未提交,此时A去查询数据库此时如果没有任何隔离操作,那么A有可能读到未提交的数据,出现脏读
A查询数据库 --> B修改数据并且提交 --> A再次查询数据库假如数据库做了限制,仅提交后的数据才会被读到。但是A仍有可能在B被提交前后两次读取中,获取到了被B修改后的不同的数据,出现不可重复读
A查询数据库 --> B新增数据并且提交 --> A再次查询数据库假定数据库在2的基础上进一步做限制,对第一次查询的数据记录加了锁或创建快照。但A前后两次查询语句条件,仍有可能包含B新增的记录,于是出现了幻读
事务的隔离性
对应上面的问题,于是对应的有几种隔离。
READ UNCOMMITTED:未作任何隔离,此时之前的1、2、3都可能发生
READ COMMITTED(RC):顾名思义,只读提交后的数据,那么可以解决问题(1)脏读
REPEATABLE READ(RR):解决(2)不可重复读的问题的隔离机制
SERIALIZABLE: 解决幻读的隔离级别
与MySQL的关系
语言方法
1885PZlbr3ms2P
b845M适合上班族的25个副业
33482011-08-25 11:24:43
MySQL默认采用RR级别,但是MySQL的RR级别,也可解决幻读问题。
这种控制多事务并发隔离的做法,有个名字叫MVCC(多版本并发管理)。
MySQL的实现方式:通过在每条记录后面增加两个事务版本号,版本号是每个事务开始时唯一生成的。两个版本号一个存储创建版本,一个存储删除版本。
查询时,事务只查询
规则1:创建版本在本事务之前 - 从而去除被其他事务新加入的记录
规则2:且删除版本号大于本事务(或不存在)的记录 - 从而保证被其他事务删除的记录仍然能读到
那么修改呢?修改时,MySQL会生成一条新记录,并更新原记录删除版本号。这样
对于本事务来说,因为有规则2,所以查询不到原记录
对于其他事务(在次事务开始前的事务),因为有规则1,新插入的记录版本会高于其他事务版本,其他事务也就读不到了。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Innodb中的事务隔离级别和锁的关系 - 美团技术团队
关于MySQL数据库事务的机制学习总结
乐观锁和悲观锁的区别
一文彻底读懂MySQL事务的四大隔离级别
拿捏!隔离级别、幻读、Gap Lock、Next-Key Lock
事务的隔离级别(超详细)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服