mysql mvcc和行锁_mysql在RR的隔离级别下,究竟是通过MVCC解决幻读的还是通过行锁的next key算法解决的?...
首先,我们需要搞懂几个隔离级别的意思和每个隔离级别会出现的问题。隔离级别分为:读未提交,读提交,可重复读和可串行化。
读未提交是最低级别的隔离级别,表示当一个事务还没有提交时,他所做的变更就被别的事务读取到;在大部分场景下这显然是不允许的;
为了解决读未提交出现的问题,会将隔离级别设置为读提交,意思是只有一个事务被提交了他做的改变才会被别的事务看到;
但是读提交级别下还是会出现问题,最经典的场景就是银行转账,有这样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算法解决的?...相关推荐
- mysql不同连接的事务_mysql中不同事务隔离级别下数据的显示效果--转载
事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...
- mysql可重复读 加锁_mysql可重复读隔离级别加锁分析
问题 myql可重复读隔离级别下可能会导致插入阻塞,问题复现如下 表中有3列都是int类型 其索引情况如下: id为主索引,c,d为普通索引 现在开始制作问题: 在这里我分别开启两个事务:第一个事务中 ...
- mysql 消极锁_MySQL支持的事物隔离级别以及消极锁和乐观锁原理和应用场景
在一样平常开发中,尤其是营业开发,少不了行使 Java 对数据库举行基本的增删改查等数据操作,这也是Java工程师的必备手艺之一.做好数据操作,不仅仅需要对Java语言相关框架的掌握,更需要对种种数据 ...
- mysql索引commit卡死_mysql 5.6 read-committed隔离级别下并发插入唯一索引导致死锁一例...
今天,某个环境又发生了死锁,如下: *** (1) TRANSACTION: TRANSACTION 735307073, ACTIVE 0 sec inserting mysql tables in ...
- MySQL中的InnoDB是怎么解决幻读的?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Aaron_涛 来源 | blog.csdn. ...
- 面试官:你说熟悉MySQL,那来谈谈InnoDB怎么解决幻读的?
1. 结论 首先说结论,在RR的隔离级别下,Innodb使用MVCC和next-key locks解决幻读,MVCC解决的是普通读(快照读)的幻读,next-key locks解决的是当前读情况下的幻 ...
- 灵魂拷问,MySQL到底能否解决幻读问题
先说结论,MySQL 存储引擎 InnoDB 在可重复读(RR)隔离级别下是解决了幻读问题的. 方法:是通过next-key lock在当前读事务开启时,1.给涉及到的行加写锁(行锁)防止写操作:2. ...
- MVCC能否解决幻读?
前言 之前了解过MySQL 中MVCC的相关知识,但只是知道概念,没有在实际中好好做过验证和总结,今天来从实际出发来探讨MVCC的相关知识,理论结合实践,从而对一些原理有更深的认识. 准备数据 准备一 ...
- MySQL到底是如何解决幻读问题
要知道什么是幻读,首先要知道以下四点: 一.幻读定义 幻读是指在同一个事务中,存在前后两次查询同一个范围的数据,但是第二次查询却看到了第一次查询没看到的行,一般情况下特指事务执行中新增的其他行. 二. ...
最新文章
- Paddle广播 (broadcasting)
- oracle密码错误延迟验证,oracle密码错误验证延迟
- 影响声音定位的几个因素
- 查看oracle连接数的消耗情况
- webpack之DefinePlugin使用
- Objective-C 学习记录6--dictionary
- MVC3中的视图文件
- 按键 使用WinHttp实现POST方式用户模拟登录网站
- 对称加密算法原理与常用实现
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)...
- 数据库无响应(hang住)故障处理思路和方法
- Java 后台sendHttp时出现java.net.UnknownHostException
- 笨方法学python 习题31
- 视频APP软件开发功能架构
- 静态网页HTML知识点归纳
- obj文件格式详解及示例
- JavaScript零基础入门 1:JavaScript表格简介
- switch之enum
- 关于ssm框架的外文文献及译文_学术小白应该如何高效阅读文献?
- 【⏰亲】今天冬至,早些回家!