一、MySQL索引
二、MySQL事务
三、MySQL锁
1、MySQL锁机制的由来
数据库的锁机制本身是为了解决并发事务带来的问题而诞生的,主要是确保数据库中,多条工作线程并行执行时的数据安全性。
2、MySQL锁机制的分类
-
以锁粒度的维度划分:
-
①表锁:
- 全局锁:加上全局锁之后,整个数据库只能允许读,不允许做任何写操作。
- 元数据锁 /
MDL锁:基于表的元数据加锁,加锁后整张表不允许其他事务操作。 - 意向锁:这个是
InnoDB中为了支持多粒度的锁,为了兼容行锁、表锁而设计的。 - 自增锁 /
AUTO-INC锁:这个是为了提升自增ID的并发插入性能而设计的。
-
②页面锁
-
③行锁:
- 记录锁 /
Record锁:也就是行锁,一条记录和一行数据是同一个意思。 - 间隙锁 /
Gap锁:InnoDB中解决幻读问题的一种锁机制。 - 临建锁 /
Next-Key锁:间隙锁的升级版,同时具备记录锁+间隙锁的功能。
- 记录锁 /
-
-
以互斥性的维度划分:
- 共享锁 /
S锁:不同事务之间不会相互排斥、可以同时获取的锁。 - 排他锁 /
X锁:不同事务之间会相互排斥、同时只能允许一个事务获取的锁。 - 共享排他锁 /
SX锁:MySQL5.7版本中新引入的锁,主要是解决SMO带来的问题。
- 共享锁 /
-
以操作类型的维度划分:
- 读锁:查询数据时使用的锁。
- 写锁:执行插入、删除、修改、
DDL语句时使用的锁。
-
以加锁方式的维度划分:
- 显示锁:编写
SQL语句时,手动指定加锁的粒度。 - 隐式锁:执行
SQL语句时,根据隔离级别自动为SQL操作加锁。
- 显示锁:编写
-
以思想的维度划分:
- 乐观锁:每次执行前认为自己会成功,因此先尝试执行,失败时再获取锁。
- 悲观锁:每次执行前都认为自己无法成功,因此会先获取锁,然后再执行。
四、MySQL中的MVCC
1、MVCC定义
MVCC机制的全称为Multi-Version Concurrency Control,即多版本并发控制技术,用于在多个并发事务同时读写数据库时保持数据的一致性和隔离性。
2、MVCC原理
MVCC机制主要通过隐藏字段、Undo-log日志、ReadView实现
2.1、隐藏列
- trx_id:最近一次改动当前这条数据的事务id
- roll_pointer:当一个事务对一条数据做了改动后,都会将旧版本的数据放到Undo-log日志中,而rollback_pointer就是一个地址指针,指向Undo-log日志中旧版本的数据
2.2、Undo-log
每次更新记录后,都会将旧值放到一条undo日志中.不同的旧版本数据,会以roll_ptr回滚指针作为链接点,然后将所有的旧版本数据组成一个单向链表
2.3、ReadView
一个事务在尝试读取一条数据时,MVCC基于当前MySQL的运行状态生成的快照,也被称之为读视图,即ReadView,在这个快照中记录着当前所有活跃事务的ID ReadView中的核心内容
creator_trx_id:生成该ReadView的事务的事务id。m_ids:表示在生成当前ReadView时,系统内活跃的事务id列表。up_limit_id:活跃的事务列表中,最小的事务ID。low_limit_id:表示在生成当前ReadView时,系统中要给下一个事务分配的ID值。
2.4、MVCC机制实现原理
- ①当事务中出现
select语句时,会先根据MySQL的当前情况生成一个ReadView。 - ②判断行数据中的隐藏列
trx_id与ReadView.creator_trx_id是否相同:- 相同:代表创建
ReadView和修改行数据的事务是同一个,自然可以读取最新版数据。 - 不相同:代表目前要查询的数据,是被其他事务修改过的,继续往下执行。
- 相同:代表创建
- ③判断隐藏列
trx_id是否小于ReadView.up_limit_id最小活跃事务ID:- 小于:代表改动行数据的事务在创建快照前就已结束,可以读取最新版本的数据。
- 不小于:则代表改动行数据的事务还在执行,因此需要继续往下判断。
- ④判断隐藏列
trx_id是否小于ReadView.low_limit_id这个值:- 大于或等于:代表改动行数据的事务是生成快照后才开启的,因此不能访问最新版数据。
- 小于:表示改动行数据的事务
ID在up_limit_id、low_limit_id之间,需要进一步判断。
- ⑤如果隐藏列
trx_id小于low_limit_id,继续判断trx_id是否在trx_ids中:- 在:表示改动行数据的事务目前依旧在执行,不能访问最新版数据。
- 不在:表示改动行数据的事务已经结束,可以访问最新版的数据。
2.5、RC和RR隔离级别下的MVCC的区别
- RC:每次读取数据前都生成一个ReadView
- RR:在第一次读取数据时生成一个ReadView
学习竹子大佬的文章写的笔记,持续更新,作为以后遗忘后复习使用
作者:竹子爱熊猫
链接:juejin.cn/post/715535…
来源:稀土掘金