Mysql innodb 面试要点记录(二)锁

2018-08-21  本文已影响0人  云逸Dean

1.innodb 的锁分类

1.1.意向锁:

1.2.锁的兼容列表

项目 IS IX S X
IS 兼容 兼容 兼容 不兼容
IX 兼容 兼容 不兼容 不兼容
S 兼容 不兼容 兼容 不兼容
X 不兼容 不兼容 不兼容 不兼容

2.显式加锁方式:

3.一致性非锁定读:

是指 innodb 通过多版本控制的方式来读取当前执行时间数据库中的数据。如果,读取的时候行正好在执行 DELETE 或 UPDATE 的排他操作,那读取操作不会等待,会直接去读取一个快照版本的行数据。

3.1 MVCC(多版本并发控制):

一行数据可能不止一个快照,实际上是通过 undo 段来完成的

3.2 事务隔离级别对一致性非锁定读的影响:

3.2 一致性锁定读:

则是通过在事务中显式的用 FOR UPDATE 和 LOCK IN SHARE MODE 加锁。当事务提交后锁才会释放。

4.自增长与锁:

4.1影响:

5.锁的算法:

5.1 Next-Key Lock 细节:

5.2锁的降级:

当索引含有唯一属性时,Next-key Lock会自动降级为Record Lock 用来减少锁定的范围,加大并发的处理速度。但是此种情况只存在于查询【所有的唯一索引列】。如果,唯一索引由多个列组成,而查询是查找多个唯一索引列中的其中一个,那么这种查询由于联合索引的特性,查询是一个范围查询,而不是点查询,所以不会降级处理。

5.3如何规避幻读:

当某个表有2个索引,一个聚集唯一索引,一个辅助索引。有(1,1)(2,3),(3,5),(4,7)这4个数据行。执行SELECT * FROM T WHERE b=5 FOR UPDATE。此时聚集唯一索引因为锁降级的优化,会对a=3加上Record Lock,但是为了避免幻读,辅助索引会有2种锁,第一种是b=5的Record Lock,还有(3,5)(5,7) 2个范围的Grap lock。由于索引 B+tree 的属性,联合索引 a列又在b列之前,所以索引的节点值是


                          [举例,索引不一定真的是这种结构]    
                                      []  (3,5)   [] 
                                     /             \    
                               [(1,1)(2,3)]     [(3,5)(4,7)]   

如果没有锁定b 列的(5,7)范围我再insert (4,5) 是可以插入进去的,因为a=3和 b=5都被 record lock 锁定了,但是按联合索引的特性是按前序列进行排序插入的,此时并不会触发到b=5的 record lock。这样就会导致幻读,连续执行SELECT * FROM T WHERE b=5 FOR UPDATE这个语句上一个事务的结果与下一次执行的这个语句得到的结果不会一样。

6.锁问题:

mysql innodb 的默认事务级别是 REPEATABLE READ

7.阻塞和死锁

略过,可以在其他层面理解。目前还没有深入了解的打算

8.锁升级:

由于 innodb 的锁根据页粒度进行加锁,并采取位图的方式,锁资源开销较小,不存在锁升级的操作。

Mysql innodb 面试要点记录(一)缓冲和索引

上一篇下一篇

猜你喜欢

热点阅读