MySQL常用点
2020-04-27 11:01:24 0 举报
AI智能生成
MySQL常见面试题
作者其他创作
大纲/内容
1. B+树
2. 锁
锁的类型
共享锁(S锁)
只读不能修改
select * from table where id = 1 lock in shared mode;
排他锁(X锁)
不能与其他锁共存
select * from table where id = 1 for update;
insert\delete\update 默认加上X锁
意向锁
意向锁产生原因:
1. 解决表锁和之前可能存在的行锁之间的冲突,
2. 是一种表锁,数据库会自动添加。
3. 避免为了判断是否存在行锁而进行全表扫描。
1. 解决表锁和之前可能存在的行锁之间的冲突,
2. 是一种表锁,数据库会自动添加。
3. 避免为了判断是否存在行锁而进行全表扫描。
意向锁共享锁(IS锁)
一个数据行S之前必须先加IS
意向锁排他锁(IX锁)
一个数据行在加X之前必须加IX
自增锁
针对自增列的一个特殊的表级锁
行锁到底锁了什么?
行锁:是通过索引上的索引项加锁来实现的
只有通过索引条件进行检索,InnoDB才使用行锁,否则使用表锁
行锁的算法
临键锁
InnoDB的默认行锁算法,Next Key Lock = Gap Lock + Record Lock
定义:按索引查询,查询条件为范围查询时,查询结果:命中数据
会加上Next Key Lock(左开右闭]
间隙锁
定义:按索引查询,查询结果不存在
会锁住不存在区间,左开右开
记录锁
定义:按唯一性索引查询,查询条件为等值查询时,查询结果存在
锁住具体索引项
如何利用锁进行并发控制?
利用锁怎么解决脏读?
使用X锁,select for update
利用锁怎么解决幻读
使用Next Key Lock
利用锁怎么解决不可重读?
使用S锁,其他事务只能读不能写,select lock in shared mod
3. MVCC(只在RC、RR两个级别下生效)
通过Undo Log和版本链实现数据多版本
如何实现数据多版本?
Undo log: 用于存放数据被修改前的值。可以用于数据回滚。 -- 保证原子性
Redo log: 记录数据修改后的值。-- 保证持久性
-- 当系统崩溃时,虽然数据没有持久化,但是redo log已经持久化,系统可以根据redo log恢复到最新状态。
Undo log: 用于存放数据被修改前的值。可以用于数据回滚。 -- 保证原子性
Redo log: 记录数据修改后的值。-- 保证持久性
-- 当系统崩溃时,虽然数据没有持久化,但是redo log已经持久化,系统可以根据redo log恢复到最新状态。
版本链
DB_ROW_ID
自增ID,只有聚簇索引才有
DB_TRX_ID
记录每次对某条聚簇索引修改时的事务ID
DB_ROLL_PTR
记录上一次修改的undo log位置
通过锁实现并发控制
利用锁解决写-写冲突问题
利用MVCC解决读-写冲突问题
通过ReadView生成策略实现事务隔离级别
作用:做可见性判断,维护了本事务不可见的其他活跃事务
举例
RC:事务中每条select都会创建ReadView
RR:在执行事务的第一条select的时候创建ReadView,后续这个事务中所有的select都复用这个对象。
面试题
4.事务隔离级别
读未提交
读已提交
可重复读
序列化
5. 高可用
https://blog.csdn.net/laogouhuli/article/details/92591386
0 条评论
下一页