2019-07-21[读书笔记]Innodb的锁
原文链接:https://www.jianshu.com/p/95a0d10eb881
问1. mysql到底有几种锁 ? (行锁, 页锁, 表锁, 全局锁 ?? )
答:
1.首先, 问题应该确定范围为innodb引擎有几种锁
2. innodb 按照锁的范围, 分为 : 表锁, 行锁.
3. 行锁又分为共享锁, 排他锁.
注意: 为了兼容表锁和行锁, innodb 引入了意向锁的概念. 意向锁可以减少搜索行锁时的全表扫描.
4.如果一个表有排他锁, 此时要给该表加共享锁或排他锁, 都会阻塞.
5.意向锁是表级锁, ==> 为什么 ?
6. 意向锁之间不冲突, 因为锁的可能不是同一行. 但是,如果是同一行, 是后者会被阻塞吗? 如何实现? 猜测: 因为行锁是加在索引项上, 所以索引项肯定有个标识位, 可判断当前项是否有行锁.

问2. 在innodb 引擎的默认可重复读隔离级别下 , select insert update delete 分别会有什么锁?
答:
1. 普通的select语句,Innodb不会加任何锁!! 所以S锁需要显示加锁:
//共享锁 select * from table_name where ... lock in share mode;
//排它锁 select * from table_name where ... for update;
2.对于update、delete和insert语句,Innodb会自动给涉及数据集加排他锁(X)
问3: 既然使用共享锁的同时, 进行update, 会造成死锁, 那共享锁有什么用?
原文: 只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。mysql的行锁是针对索引加的锁。不是针对记录加的锁,虽然是访问不同的行,但是若是相同的索引,会出现锁锁冲突的。
问4.1: 相同的索引, 是什么意思? 猜测: 字段公司名中有索引: 则同一个公司名的所以都会被锁住?
问4.2: 锁锁冲突又是什么 ? 猜测: 第二个锁阻塞 ?
原文: 而且就算条件里面使用了索引,Mysql也不一定走索引,还是要看SQL的执行计划!!!
注意: 在分析锁冲突的时候,不要忘记检查SQL的执行计划,以确定是否真正使用了索引。
以下为新知识:
一: 间隙锁
1.是什么:
当我们用范围条件而不是相等条件检索数据的时候,并请求共享或者排他锁时,InnoDB会给符合条件的已有的数据记录的索引项加锁。
2.怎么加间隙锁:
对于键值在条件范围内但是不存在的记录,叫做间隙(GAP)。InnoDB也会对这个“间隙”加锁,这种锁机制就是间隙锁(Next-Key锁)
3.为什么加间隙锁:
1.防止幻读,以满足相关隔离级别的要求;
2.满足恢复和复制的需要;
4.间隙锁的危害:
锁定的时候无法插入锁定键值范围内的任何数据。
注意:在实际应用开发中,尤其是并发插入比较多的应用,尽量优化业务逻辑,尽量使用相等的条件来访问更新数据,避免使用范围条件。
问5: 间隙锁是如何造成死锁的 ?