做一个合格的程序猿之MYSQL存储引擎INNODB简介之非锁定读(二)
2016-03-03 20:02
579 查看
MYSQL5.5版本之后默认的存储引擎是INNODB,其最主要的特点之一是支持非锁定读
面试中最常见的问题是mysql的事务隔离级别,感觉大家都快背诵了(下面摘入于《高性能MYSQL第三版》):
好了,背诵完了之后,简单的介绍一下原理:
首先介绍一下多版本并发控制(MVCC,Multi Version Concurrency Control)
因为innodb存储引擎一个特性是非锁定读,即意味着当某行数据正在做更新操作的时候,这时会产生行级锁,此时该读取线程并不会等待该锁的释放,而是先读取这一行的快照,并且该行不止一个快照,快照(Snapshot)是指该行之前版本的数据,多个快照是这行数据的多个版本,这种技术就叫做MVCC技术
(图片来自《MYSQL技术内幕 INNODB存储引擎》)
在事务级别是READ COMMITED的情况下,线程总是读取最新一份快照数据,因为在读取的过程中,其他的线程可能操作了该行数据,所以每次读取的数据可能不一致,即产生了所谓的脏读的情况,也可以叫做不可重复读,因为每次读取的内容不一定一样
在事务级别是READ REPEATABLE情况下,线程总是读取事务开始时的行版本的数据,所以读取的内容总是一致的
面试中最常见的问题是mysql的事务隔离级别,感觉大家都快背诵了(下面摘入于《高性能MYSQL第三版》):
好了,背诵完了之后,简单的介绍一下原理:
首先介绍一下多版本并发控制(MVCC,Multi Version Concurrency Control)
因为innodb存储引擎一个特性是非锁定读,即意味着当某行数据正在做更新操作的时候,这时会产生行级锁,此时该读取线程并不会等待该锁的释放,而是先读取这一行的快照,并且该行不止一个快照,快照(Snapshot)是指该行之前版本的数据,多个快照是这行数据的多个版本,这种技术就叫做MVCC技术
(图片来自《MYSQL技术内幕 INNODB存储引擎》)
在事务级别是READ COMMITED的情况下,线程总是读取最新一份快照数据,因为在读取的过程中,其他的线程可能操作了该行数据,所以每次读取的数据可能不一致,即产生了所谓的脏读的情况,也可以叫做不可重复读,因为每次读取的内容不一定一样
在事务级别是READ REPEATABLE情况下,线程总是读取事务开始时的行版本的数据,所以读取的内容总是一致的
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复