首先,我们需要搞懂几个隔离级别的意思和每个隔离级别会出现的问题。隔离级别分为:读未提交,读提交,可重复读和可串行化。

读未提交是最低级别的隔离级别,表示当一个事务还没有提交时,他所做的变更就被别的事务读取到;在大部分场景下这显然是不允许的;

为了解决读未提交出现的问题,会将隔离级别设置为读提交,意思是只有一个事务被提交了他做的改变才会被别的事务看到;

但是读提交级别下还是会出现问题,最经典的场景就是银行转账,有这样2个事务A,B同时进行,A事务中账户拥有者将自己的钱从X账户转到Y账户,当钱还没有转到Y账户时,B事务查询了Y账户的钱,这时候事务A结束,钱已经从X账户扣除转给了Y账户,因为是读提交级别,事务提交了,修改也可见了,B事务继续查询自己X账户的钱,因为数据更新,在B事务中用户看到的情况是自己的总金额少了,这就出现了不可重复读的问题。

为了解决不可重复读的问题,出现了可重复读隔离级别,innodb使用MVCC解决了不可重复读的问题,也就实现了可重复读的隔离级别,MVCC机制是为每个事务提供快照隔离,事务执行期间对数据的可见性是有要求的,事务执行期间读到的数据和事务开始执行时的数据是一致,关于可见性有这样的原则:在事务A开始执行时,如果其他的事务B提交了那么数据更改是可见的,如果在事务A执行期间,其他事务B提交了,那么事务B所做的数据更改是不可见的。MVCC的实现原理是基于undo log实现。undo log是用类似链表的方式实现,当事务在RR级别会使用undo log推算当前视图下的数据。

但是在可重复读隔离级别下,还是会出现问题,那就是幻读,当事务在执行期间读数据会分为两种情况,一种是快照读,在这种情况下,读到的数据就是快照数据,看不到其他的数据更改,另一种是当前读,这种情况下会读到更新的数据,这时会对表加上行锁,对于数据(1 2 4 5),当查询小于4的数时候,会读到(1 2),这时候会对1 2加锁,保证数据不会被修改,但是如果其他事务插入了一个3,当事务再更新读的时候就会读到(1 2 3),因为3这个数之前没有出现过也就没法锁住,这时候就出现了幻读,在一个事务的两次当前读的时候出现数据不一致的情况就是幻读。因为没法锁住不存在的行。

为了解决这个问题,innodb使用next-key锁实现,next-key锁=行锁+间隙锁,而间隙锁就是用来锁住这些不存在的数据,锁住(2,3)这个间隙,保证不会被插入新的数据。所以就解决了幻读的问题。

总之,在标准的可重复读(RR)是无法解决幻读问题的,MySQL比较特殊在RR隔离级别也解决了幻读的问题,因为MySQL默认使用innodb作为存储引擎,而innodb使用next key锁解决了幻读的问题。

因为有些东西记不准了,有问题欢迎提出。

mysql mvcc和行锁_mysql在RR的隔离级别下,究竟是通过MVCC解决幻读的还是通过行锁的next key算法解决的?...相关推荐

  1. mysql不同连接的事务_mysql中不同事务隔离级别下数据的显示效果--转载

    事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...

  2. mysql可重复读 加锁_mysql可重复读隔离级别加锁分析

    问题 myql可重复读隔离级别下可能会导致插入阻塞,问题复现如下 表中有3列都是int类型 其索引情况如下: id为主索引,c,d为普通索引 现在开始制作问题: 在这里我分别开启两个事务:第一个事务中 ...

  3. mysql 消极锁_MySQL支持的事物隔离级别以及消极锁和乐观锁原理和应用场景

    在一样平常开发中,尤其是营业开发,少不了行使 Java 对数据库举行基本的增删改查等数据操作,这也是Java工程师的必备手艺之一.做好数据操作,不仅仅需要对Java语言相关框架的掌握,更需要对种种数据 ...

  4. mysql索引commit卡死_mysql 5.6 read-committed隔离级别下并发插入唯一索引导致死锁一例...

    今天,某个环境又发生了死锁,如下: *** (1) TRANSACTION: TRANSACTION 735307073, ACTIVE 0 sec inserting mysql tables in ...

  5. MySQL中的InnoDB是怎么解决幻读的?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Aaron_涛 来源 | blog.csdn. ...

  6. 面试官:你说熟悉MySQL,那来谈谈InnoDB怎么解决幻读的?

    1. 结论 首先说结论,在RR的隔离级别下,Innodb使用MVCC和next-key locks解决幻读,MVCC解决的是普通读(快照读)的幻读,next-key locks解决的是当前读情况下的幻 ...

  7. 灵魂拷问,MySQL到底能否解决幻读问题

    先说结论,MySQL 存储引擎 InnoDB 在可重复读(RR)隔离级别下是解决了幻读问题的. 方法:是通过next-key lock在当前读事务开启时,1.给涉及到的行加写锁(行锁)防止写操作:2. ...

  8. MVCC能否解决幻读?

    前言 之前了解过MySQL 中MVCC的相关知识,但只是知道概念,没有在实际中好好做过验证和总结,今天来从实际出发来探讨MVCC的相关知识,理论结合实践,从而对一些原理有更深的认识. 准备数据 准备一 ...

  9. MySQL到底是如何解决幻读问题

    要知道什么是幻读,首先要知道以下四点: 一.幻读定义 幻读是指在同一个事务中,存在前后两次查询同一个范围的数据,但是第二次查询却看到了第一次查询没看到的行,一般情况下特指事务执行中新增的其他行. 二. ...

最新文章

  1. Paddle广播 (broadcasting)
  2. oracle密码错误延迟验证,oracle密码错误验证延迟
  3. 影响声音定位的几个因素
  4. 查看oracle连接数的消耗情况
  5. webpack之DefinePlugin使用
  6. Objective-C 学习记录6--dictionary
  7. MVC3中的视图文件
  8. 按键 使用WinHttp实现POST方式用户模拟登录网站
  9. 对称加密算法原理与常用实现
  10. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)...
  11. 数据库无响应(hang住)故障处理思路和方法
  12. Java 后台sendHttp时出现java.net.UnknownHostException
  13. 笨方法学python 习题31
  14. 视频APP软件开发功能架构
  15. 静态网页HTML知识点归纳
  16. obj文件格式详解及示例
  17. JavaScript零基础入门 1:JavaScript表格简介
  18. switch之enum
  19. 关于ssm框架的外文文献及译文_学术小白应该如何高效阅读文献?
  20. 【⏰亲】今天冬至,早些回家!

热门文章

  1. ​供应链管理-ERP的前世今生
  2. 华为云PB级数据库GaussDB(for Redis)揭秘第九期:与HBase的对比
  3. IAP:物联网终端软件升级技术
  4. 为什么说容器的崛起预示着云原生时代到来?
  5. 干货:不同场景容器内获取客户端源IP的方法
  6. 高性能Web动画和渲染原理系列(3)——transform和opacity为什么高性能
  7. AI本质就是“暴力计算”?看华为云如何应对算力挑战
  8. python推导式pythonic必备
  9. python基础知识学习笔记(2)
  10. R语言学习笔记(七)方差分析