SQL必知必会
陈旸
清华大学计算机博士
立即订阅
10179 人已学习
课程目录
已完结 49 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词丨SQL可能是你掌握的最有用的技能
免费
第一章:SQL语法基础篇 (19讲)
01丨了解SQL:一门半衰期很长的语言
02丨DBMS的前世今生
03丨学会用数据库的方式思考SQL是如何执行的
04丨使用DDL创建数据库&数据表时需要注意什么?
05丨检索数据:你还在SELECT * 么?
06丨数据过滤:SQL数据过滤都有哪些方法?
07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?
08丨什么是SQL的聚集函数,如何利用它们汇总表的数据?
09丨子查询:子查询的种类都有哪些,如何提高子查询的性能?
10丨常用的SQL标准有哪些,在SQL92中是如何使用连接的?
11丨SQL99是如何使用连接的,与SQL92的区别是什么?
12丨视图在SQL中的作用是什么,它是怎样工作的?
13丨什么是存储过程,在实际项目中用得多么?
14丨什么是事务处理,如何使用COMMIT和ROLLBACK进行操作?
15丨初识事务隔离:隔离的级别有哪些,它们都解决了哪些异常问题?
16丨游标:当我们需要逐条处理数据时,该怎么做?
17丨如何使用Python操作MySQL?
18丨SQLAlchemy:如何使用Python ORM框架来操作MySQL?
19丨基础篇总结:如何理解查询优化、通配符以及存储过程?
第二章:SQL性能优化篇 (18讲)
20丨当我们思考数据库调优的时候,都有哪些维度可以选择?
21丨范式设计:数据表的范式有哪些,3NF指的是什么?
22丨反范式设计:3NF有什么不足,为什么有时候需要反范式设计?
23丨索引的概览:用还是不用索引,这是一个问题
24丨索引的原理:我们为什么用B+树来做索引?
25丨Hash索引的底层原理是什么?
26丨索引的使用原则:如何通过索引让SQL查询效率最大化?
27丨从数据页的角度理解B+树查询
28丨从磁盘I/O的角度理解SQL查询的成本
29丨为什么没有理想的索引?
30丨锁:悲观锁和乐观锁是什么?
31丨为什么大部分RDBMS都会支持MVCC?
32丨查询优化器是如何工作的?
33丨如何使用性能分析工具定位SQL执行慢的原因?
34丨答疑篇:关于索引以及缓冲池的一些解惑
35丨数据库主从同步的作用是什么,如何解决数据不一致问题?
36丨数据库没有备份,没有使用Binlog的情况下,如何恢复数据?
37丨SQL注入:你的SQL是如何被注入的?
第三章:认识DBMS (7讲)
38丨如何在Excel中使用SQL语言?
39丨WebSQL:如何在H5中存储一个本地数据库?
40丨SQLite:为什么微信用SQLite存储聊天记录?
41丨初识Redis:Redis为什么会这么快?
42丨如何使用Redis来实现多用户抢票问题
43丨如何使用Redis搭建玩家排行榜?
44丨DBMS篇总结和答疑:用SQLite做词云
第四章:SQL项目实战 (3讲)
45丨数据清洗:如何使用SQL对数据进行清洗?
46丨数据集成:如何对各种数据库进行集成和转换?
47丨如何利用SQL对零售数据进行分析?
结束语 (1讲)
结束语 | 互联网的下半场是数据驱动的时代
SQL必知必会
登录|注册

31丨为什么大部分RDBMS都会支持MVCC?

陈旸 2019-08-21
上一篇文章中,我们讲到了锁的划分,以及乐观锁和悲观锁的思想。今天我们就来看下 MVCC,它就是采用乐观锁思想的一种方式。那么它到底有什么用呢?
我们知道事务有 4 个隔离级别,以及可能存在的三种异常问题,如下图所示:
在 MySQL 中,默认的隔离级别是可重复读,可以解决脏读和不可重复读的问题,但不能解决幻读问题。如果我们想要解决幻读问题,就需要采用串行化的方式,也就是将隔离级别提升到最高,但这样一来就会大幅降低数据库的事务并发能力。
有没有一种方式,可以不采用锁机制,而是通过乐观锁的方式来解决不可重复读和幻读问题呢?实际上 MVCC 机制的设计,就是用来解决这个问题的,它可以在大多数情况下替代行级锁,降低系统的开销。
今天的课程主要包括以下几个方面的内容:
MVCC 机制的思想是什么?为什么 RDBMS 会采用 MVCC 机制?
在 InnoDB 中,MVCC 机制是如何实现的 ?
Read View 是如何工作的?

MVCC 是什么,解决了什么问题

MVCC 的英文全称是 Multiversion Concurrency Control,中文翻译过来就是多版本并发控制技术。从名字中也能看出来,MVCC 是通过数据行的多个版本管理来实现数据库的并发控制,简单来说它的思想就是保存数据的历史版本。这样我们就可以通过比较版本号决定数据是否显示出来(具体的规则后面会介绍到),读取数据的时候不需要加锁也可以保证事务的隔离效果。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(19)

  • 许童童
    我来回答一下思考题:
    为什么隔离级别为读未提交时,不适用于 MVCC 机制呢?
    因为隔离级别是读未提交,所以跟本就不需要版本控制,直接读取最新的数据就好了。

    读已提交和可重复读这两个隔离级别的 Read View 策略有何不同?
    读已提交每一次Select都会重新查询Read View,保证可以读到其它事务的提交。
    可重复读会复用第一次查询到的Read View,不会读到其它事务的提交,加上Next-Key锁的配合,从而避免幻读。

    作者回复: 对的 读未提交不需要版本控制

    2019-08-21
    2
    9
  • 老毕
    1. 为什么隔离级别为读未提交时,不适用于 MVCC 机制呢?

    “读未提交”隔离级别不需要多版本数据。每个事务都读取最新数据,假设事务A把X从0改成1,无论事务A是否提交,事务B读到X为1,如果事务A回滚,事务B再次读X,自然就得到0,根本不需要MVCC帮衬。

    2. 读已提交和可重复读这两个隔离级别的 Read View 策略有何不同?

    “读已提交”时,每次SELECT操作都创建Read View,无论SELECT是否相同,所以可能出现前后两次读到的结果不等,即不可重复读。
    “可重复读”时,首次SELECT操作才创建Read View并复用给后续的相同SELECT操作,前后两次读到的结果一定相等,避免了不可重复读。

    作者回复: 对的 分析总结的很好

    2019-08-24
    5
  • asdf100
    如图所示,trx_ids 为 trx2、trx3、trx5 和 trx8 的集合,活跃的最大事务 ID(low_limit_id)为 trx10,活跃的最小事务 ID(up_limit_id)为 trx4。

    没理解这个10和4怎么来的,不是说就2 3 5 8这个活跃事务吗?
    2019-08-21
    2
    5
  • Yuhui
    请教老师以下几个问题:
    1. MVCC机制在各个数据库中默认是打开的还是关闭的?
    2. 是否可以控制MVCC机制的打开和关闭?
    3. 如何查看数据记录的隐藏列?
    谢谢!
    2019-09-26
    2
  • 空知
    老师 问下:
    1、如果RV不符合 就需要去Undo Log里面去判断快照记录了,这里对于快照记录 会一直比较下去直到找到一个可见版本 或者查询全部历史版本为止?
    2、间隙锁 锁住一个范围不包含 行记录本身,是指 对某条记录添加间隙锁之后 还可以针对这条记录本身做修改操作吗?
    2019-08-31
    2
  • Ryoma
    如果有的同学看了前面的,没有看到这一章 MVCC。是不是就会产生误解,比如 MySQL Innodb 在可重复读隔离级别下,会发生幻读现象?这类观点,在之前说的时候,是不是需要提前说一下?
    2019-09-19
    1
  • 安静的boy
    想说一下最后一个列子,innodb是如何解决幻读的。作者举的例子是innodb在当前读的情况下如何解决幻读(通过加next-key 锁)。如果在快照读下,利用readView就可以解决了。
    2019-08-23
    1
  • 朱成亮
    这块有点难~
    2019-12-10
  • GLADIATOR
    MySQL可重复读加next key是可以解决幻读的
    2019-09-30
  • 峻铭
    测试结果发现比2.08矮的插入是也会阻塞
    2019-09-26
  • L荀
    不理解的请教下作者大神:1.可重复读级别下,新加入的行,版本号高于当前事物版本号,不用next-key锁,应该也不会出现幻读,这个怎么理解啊。2.例子中为什么加了for update 读锁呀,不是应该不用锁的么
    2019-09-23
  • study~
    既然 事务A已经上了 排他锁,,其他用户怎么可以对上锁的记录进行修改?
    2019-09-17
    1
  • innovationmech
    看了几遍文章和留言,有点懂了。。。

    作者回复: 加油

    2019-09-16
  • Leon📷
    在 Read VIew 中有几个重要的属性:

    trx_ids,系统当前正在活跃的事务 ID 集合。这个事务ID集合是针对这一行的事物集合吧,不是整个mysql的系统事务集合
    2019-09-12
  • Alpha
    Step 4. 如果不符合Read View 规则,就需要从Undo Log中获取历史快照。不太明白这里的"Read View规则"指的是什么?
    2019-08-21
    1
  • humor
    InnoDB的MVCC不可以防止出现幻读吗?比如文中的例子,A事件在开启的时候,B事务还没有提交,在A事件执行的过程中B事务提交了,在A事务读取数据的时候,通过查询Read View,应该会发现B提交的行记录是活跃的或者未提交的事务id,所以就算没有Next-key锁,A事务也读不到B事务提交的数据吧?
    2019-08-21
  • LW
    读未提交的意思就是所有更新都可见,所以没必要用MVCC机制了。读已提交每次读都要检查当前的活跃事务更新Read View,保证可以读到其他事务提交的最新数据。可重复读的Read View是记录当前事务开始时的活跃事务,这样在当前事务处理期间,才能避免其他事务提交后出现幻读。
    2019-08-21
  • 我行我素
    2.读已提交的隔离级别下,同样的查询语句都会重新获取Read View,
    可重复的隔离级别下,一个事物只在第一次SELECT的时候获取一次Read View
    2019-08-21
  • Ant
    最后一个可重复读隔离级别,当事务A读的时候,如果事务B新增的时候首先是会阻塞吧?如果阻塞时间超过最大事务超时时间才会报错,感觉这个地方说直接报错,可能有些童鞋会有误解~
    2019-08-21
收起评论
19
返回
顶部