以前在学习《数据库概论》这门课程的时候,了解到在可重复读这个隔离级别下,一个事务内同一个SELECT查询的多次执行会返回相同的结果,而这个是对查询返回的记录加共享锁来实现的。这样,别的事务如果要更新相同的记录的话就必要要等前一个事务先释放锁。说白了,这就是通过数据库三级封锁协议(三级封锁协议:在一级封锁协议的基础上,事务T在读取数据R之前,必须先对其加上S锁,直到事务结束后才释放。三级封锁协议可以防止丢失更新、脏读和不可重复读)实现的。
但是最近在Mysql数据库上测试的时候,发现一个事务在可重复读隔离级别下查询了某个记录,在没有提交前,别的事务居然可以更新、删除这个记录并且顺利地提交,而且在原事务内再次查询的时候,记录还和第一次返回一样。开始觉得太不可思议了,这和自己的理解完全不一样,上网查阅了相关的资料后才明白,原来Mysql使用了Multi-Version Concurrent Controll多版本并发控制的技术来实现非阻塞式读的。
MySQL InnoDB使用MVCC来实现非阻塞式读,在这个模式下,数据库会为每个数据记录维护多个版本。在可重复读隔离级别下,事务第一次查询记录的时候,会记录下一个时间点,在该事务内如果再次(可是以不同的SELECT)查询相同的数据的话,事务只会取时间点前的记录版本,这样在不需要对数据加锁的情况下就实现了可重复读的隔离级别了,而且并发性能更好。在同一事务内多次查询同一数据,也不是就返回一个固定的记录版本,如果事务先查询了某个记录,随后自己又更新了这个数据,等再查询该数据的话,返回的就是自己更新过后的数据版本了。
对于读已提交这个隔离级别,事务内的查询操作总是会取数据最新的有效版本,即最新的、别的事务已经提交的内容。通过MVCC,事务内的查询操作(这里排除SELECT FOR UPDATE和SELECT LOCK IN SHARE MODE两种情况)就不需要对数据加任何锁了,这样,别的事务就可以在不影响原事务的前提下自由的操作这些记录,极大的提升了并发性能。
相关推荐
MySQL Innodb 索引原理详解
MySQL InnoDB 查询优化实现分析,欢迎下载,1111111111111
MySQL体系结构及原理(innodb)图文完美解析
内容深入,从源代码的角度深度解析了InnoDB的体系结构、实现原理、工作机制,并给出了大量最佳实践,能帮助你系统而深入地掌握InnoDB,更重要的是,它能为你设计和管理高性能、高可用的数据库系统提供绝佳的指导。...
MySQL InnoDB 源码实现分析
MySQL技术内幕InnoDB存储引擎-读书笔记.pdf
mysql innodb类型数据库表 根据ibd文件获取表 space id,用于恢复innodb类型数据表数据
这是我从网上找到的mysql/mariadb对innodb表进行数据恢复的工具,实现从innodb的数据库文件中恢复数据,用于实现下面情况:1、直接下载了innodb数据库的文件,而不是导出其数据,想恢复数据时(需要有完整的文件,...
Mysql 高可用 InnoDB Cluster 多节点搭建过程
Innodb 通过多版本并发控制(MVCC)来获得高并发性,并且实现了sql标准的4种隔离级别,默认为repeatable_read 级别。同时使用一种 -- next-key locking 的锁策略来避免幻读现象的产生,还提供了插入缓冲(insert ...
MySQL 和 InnoDB 性能
最近在学习MySQL技术内幕 InnoDB存储引擎 第2版,整理了一些文档分享出来,同时也方便以后查看。若有不当之处,烦请批评指正。 1. MySQL体系结构和存储引擎 2. InnoDB存储引擎 2.1 InnoDB体系结构 2.2 ...
Mysql 的InnoDB引擎的相关笔记 1.0.MySQL架构到innoDB架构.md 1.1.0.InnoDB——简介.md 1.1.1.InnoDB——关键特性.md 1.2.0.InnoDB内存结构——缓冲池.md 1.2.1.InnoDB内存结构——log buffer.md 1.2.2.InnoDB内存...
mysql 5.6 新特性 innodb
基于CentOS7 搭建基于InnoDB引擎的Mysql 8 集群环境
MySql Innodb 引擎特性详解
Mysql innodb tablespace 表空间实践
本文详细介绍了mysql innodb引擎的原理、配置、调优、故障排除等
MySQL innodb 8.0 新特性 Oracle原厂工程师52页PPT MySQL innodb 8.0 新特性