一.数据库隔离级别

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE

---在传统的数据库的执行引擎中,标准的可重复读是没有彻底解决幻读的,这也是大家经常说的数据库的可重复读并没有彻底解决幻读的原因


上述为官方对幻读的解释:只要在一个事务中,第二次select多出了row就算幻读

下面简单的介绍一下RR幻读的解决方式

在一个事务中,查询时分为快照读和当前读,标准的可重复读没有彻底解决幻读的意思也就是:快照读解决了幻读,但是当前读并没有解决,所以总体上来说并没有彻底解决幻读

1.MVCC

在快照读当中,解决幻读是使用MVCC来解决的,MVCC全称Multi-Version Concurrency Control,即多版本的并发控制协议,为什么说是多版本呢,见下图:

undo log中的版本链是指一条数据被多个事务一次修改而形成的一个历史记录版本,undo log和redo log是数据库对于原子性,持久性,隔离性的实现,本文不赘述。

RR隔离级别下,手动启动一个事务,进行select操作,他会生成一个readview模板,可以理解为将当前数据库的数据复制一份,在当前事务中,之后不管进行多少次select查询,都是在模板中去取数据,所以不管数据库中是否对数据进行了改变,都不会影响当前事务数据的读取,从而避免了幻读。

但是如果在当前事务中使用了下图语句进行当前读:

for update是进行当前读的操作,他会重新从数据库去加载当前的最新的数据,每执行一次加载一次,如果在此时,另外一个事务为数据库添加了一个事务,再进行查询,会发现查询的数据与之前相比多了或者少了,这也就是幻读现象。

2.Mysql的innodb引擎彻底解决RR下的幻读现象

上述都是在标准的可重复读下的情况,在innodb存储引擎中对可重复读进行了改造,为当前读加上了 Next-key Lock,也就是间隙锁和行锁的统称,行锁防止了别的事务修改或者删除,间隙锁防止了别的事务新增。也就是在进行上面的for update事务中,其他的事务不能对数据进行增删操作,执行会报错

注意:如果A事务如果进行了快照读,然后通过B事务对数据就行增删,然后紧接着A事务进行当前读操作,两次读取数据不一致,不能算作幻读,因为幻读定义是同一个select语句,快照读和当前读的查询语句是不一样的

总结:

  1.  在标准的RR下并没有彻底解决幻读,但是在Mysql的innodb引擎中彻底解决了
  2.  innodb通过 Next-Key lock解决的幻读问题,其实也就是阻塞串行化了
  3. 不能把快照读和当前读在一个事务中进行比较是否出现幻读,两者不是同一个select,不满足幻读的官方定义

关于数据库隔离级别为RR(可重复读)下是否解决幻读问题相关推荐

  1. Mysql默认隔离级别为什么是可重复读?

    知识点总结 1.数据库默认隔离级别: mysql -可重复读: oracle,postgres -已提交读 2.mysql binlog的格式三种:statement,row,mixed 3.为什么m ...

  2. [转]为什么mysql默认隔离级别设置为可重复读

    一般的DBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle.SQLServer等,而MySQL却使用可重复读(Read-Repeatable,RR).要 ...

  3. 专题-子项-1-mysqlf-默认隔离级别为什么是可重复读?为什么业务代码建议用读已提交?

    经典参考:https://blog.csdn.net/java_collect/article/details/105042975 binlog有几种格式? 三种,分别是 ----statement: ...

  4. Mysql可重复读隔离级别下如何解决幻读

    Mysql可重复读隔离级别下如何解决幻读 一些概念 具体加锁说明 使用主键索引进行等值查询 使用主键索引进行范围查询 使用二级索引进行等值查询 使用二级索引进行范围查询 一些概念 幻读:在一次事务中, ...

  5. Mysql在可重复读事务隔离级别下怎么解决幻读的

    目录 前言 并发事务产生的问题 更新丢失 回滚丢失 覆盖丢失 脏读 不可重复读 幻读 快照读和当前读 幻读验证 快照读如何避免幻读 当前读如何避免幻读 可重复读隔离级别发生幻读情况 小结 前言 Mys ...

  6. Mysql RR级别下如何解决幻读

    快照读 在RR级别下,Mysql是根据MVCC来解决快照读时发生的幻读现象,简单来说就是利用了版本链以及Read View来实现的,RR下只有事务刚一开始时才会产生Read View,后续都会使用这个 ...

  7. 隔离级别(Isolation Levels)-------可重复读(RR-Repeatable Read)

    10.3  隔离级别(Isolation Levels) 维护数据库的一致性和数据完整性,同时又允许多个应用程序同时访问同一数据,这样的特性称为并发性.DB2数据库用来尝试强制实施并发性的方法之一是通 ...

  8. mysql不可重复读和重复读_脏读、幻读、不可重复读的区别是什么

    脏读.幻读.不可重复读的区别:1.脏读就是指当一个事务正在访问数据,并且对数据进行了修改:2.不可重复读是指在一个事务内,多次读同一数据:3.幻读是指当事务不是独立执行时发生的一种现象. [相关学习推 ...

  9. 为什么要避免不可重复读_脏读、幻读和不可重复读?为啥?

    前言: 一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏.这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性. 例子: 对银行转帐事务,不管事务成功还是失败,应该保证事 ...

最新文章

  1. python文本处理实例_Python 文件处理的简单示例
  2. 如何科学观象?生物学家建立大象行为库,参考上百篇文献,“翻译”500种大象行为...
  3. IOS本地日志记录解决方案
  4. shodan 渗透测试 漏洞挖掘 一些用法
  5. 《ASCE1885的网络编程》---Winsock APIのIP地址转换函数
  6. php内部常量_PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
  7. OpenCASCADE:扩展数据交换(XDE)的简介
  8. Shank的大步小步算法(Shank‘s Baby-Step-Giant-Step Algorithm)
  9. python仿真搭建_mock搭建——python——搭建一个简单的mock服务——简单版本
  10. (7)-(Reverse Integer)-(将整数按位反转成另外一个整数,考虑溢出)-(知道最大整数和最小整数值)...
  11. Android 文件管理器 Android文件管理器源代码
  12. 为什么从PhoneGap中逃离
  13. ...............
  14. BGSOUND与EMBED的区别
  15. 微信公众号授权H5页面
  16. 好心情平台:30分钟就可改善抑郁情绪的运动处方
  17. 七、决策树算法和集成算法
  18. 如何使用VSCode开发Qt项目?
  19. jsp页面hidden的诡异
  20. 速卖通重点国家市场俄罗斯市场分析平台热销产品推荐

热门文章

  1. linux写黑洞路由,2019-05-21 路由黑洞与黑洞路由
  2. 卷积神经网络CNN图解
  3. 【PTA】多边形周长计算(继承)
  4. 微信小程序 LBS 能力全面解析
  5. 玩转手势控制,你可能还差些高标准手势识别数据
  6. COCI. PALACINKE
  7. 首席新媒体运营黎想教程:要不要找电商代运营?
  8. Limo机器人教程-雷达导航6
  9. 基于git和svn的开源代码托管平台
  10. 关于Linux18.04系统虚拟机黑屏解决方案