本系列学习笔记旨在作者准备数据库方面面试用,有点临阵磨枪的感觉,我学习MySQL是参考的掘金小册的《MySQL 是怎样运行的:从根儿上理解 MySQL》和《MySQL 是怎样使用的:从零蛋开始学习 MySQL》,学习笔记里将核心概念和高频考点总结一下,图都是从小册里摘取的,如果涉及侵权可随时撤销,如果大家是零基础学习MySQL,强烈推荐上面的两本小册。
这一部分先针对面试题总结,后续视情况再完善。
1、MySQL解决并发问题的两种策略
事务那一篇文章介绍了数据库并发场景会出现的一系列问题,即脏写、脏读、不可重复读和幻读,以及不同事物隔离级别对应的并发问题,那怎么解决这些并发场景的问题呢?有以下两种方案:
(1)读操作采用MVCC(多版本并发控制),写操作采用加锁的方式
MVCC机制在查询之前生成一个ReadView,查询语句只能读取到生成ReadView之间已经提交的事务所做的修改,在生成ReadView之前未提交的事务或者生成ReadView之后才提交的事务所做的更改是读取不到的。MVCC机制可以不通过加锁的机制实现读-写不冲突,性能上肯定优于加锁,因此在场景运行的前提下优先使用MVCC机制。
(2)读、写操作均采用加锁的方式
MVCC机制是可以允许读取记录的旧版本的,但某些场景,比如银行转账时必须读取当前账户的最新记录,因此对读操作也加锁,保证每次读取的都是记录的最新版本。
2、基于锁粒度对MySQL中的锁的分类
不同数据库对锁粒度的支持情况是不一样的,MySQL支持三种粒度的锁,分别