2019-07-21[读书笔记]Innodb的锁

2019-07-21  本文已影响0人  Mr钧

原文链接: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: 间隙锁是如何造成死锁的 ?

上一篇 下一篇

猜你喜欢

热点阅读