Innodb锁探究

栏目: 数据库 · 发布时间: 6年前

内容简介:Innodb行锁是
  • 共享锁(S锁)

select * from table_name where ... lock in share mode;

  • 排他锁(X锁)

select * from table_name where ... for update;

  • 行锁的实现方式

Innodb行锁是 通过给索引项加锁 来实现的,只有通过 索引条件 检索数据,Innodb才使用行级锁,否则,InnoDB将使用表锁。

1.3.2 注意事项(加锁模式) 重点

  • RC,RR隔离级别下,排他锁锁住一行数据的时候,其他事务依旧可以通过普通查询查询数据,因为普通查询使用MVCC(快照读)不需要加锁。只有加锁的操作才会出现阻塞。
  • 在不通过索引条件查询的时候,InnoDB确实使用的是表锁,而不是行锁 。
  • 行锁是针对索引加的锁,而不是争对记录加锁,虽然访问不同的记录,但是如果使用相同的索引还是会出现锁冲突,例如非唯一索引的情况就会发生。
  • 即使使用了索引Innodb也不一定会使用行锁,如果执行优化引擎认为全表扫描效率更高就不会使用索引,所以在查看锁冲突时要查看 sql 的执行计划是否真正使用了索引。

1.3.3 间隙锁(Gap Lock)

当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,Innodb会给符合条件的已有数据记录的索引项加锁,对于键值在条件范围内但并不存在的记录,Innodb也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁。

1.3.4 临间锁(Next-key)

锁定记录的同时会锁记录

1.4 意向锁

  • 意向共享锁(IS)

  • 意向排他锁(IX)

    意向锁的作用就是协调行锁和表锁之间的关系的,是将行锁从另一个角度提高到了表锁的等级(伪表锁),与表锁进行判断。

  • 参考文章 : www.jianshu.com/p/95a0d10eb…

1.5 分析SQL语句加什么锁

select * from t1 where id = 1;
delete from t1 where id = 1;
  • 前提一:当前系统的隔离级别
  • 前提二:id列是否是主键
  • 前提三:如果id列不是主键,id列是否存在索引
  • 前提四:如果id列存在索引,是不是唯一索引
  • 前提五:两条sql的执行计划是什么,全表扫描or索引扫描
Innodb锁探究

以上所述就是小编给大家介绍的《Innodb锁探究》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learning PHP, MySQL, and JavaScript

Learning PHP, MySQL, and JavaScript

Robin Nixon / O'Reilly Media / 2009-7-21 / USD 39.99

Learn how to create responsive, data-driven websites with PHP, MySQL, and JavaScript - whether or not you know how to program. This simple, streamlined guide explains how the powerful combination of P......一起来看看 《Learning PHP, MySQL, and JavaScript》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具