1. 引言

开发多用户、数据库驱动的应用时,最大的一个难点是:一方面要最大程度地利用数据库的并发访问,另一方面还要确保每个用户能以一致的方式读取和修改数据。为此就有了锁的机制 [1]。

2. 锁的分类

2.1. 按粒度

锁按粒度可分为表锁、页锁和行锁

  • 表锁:直接锁定整个数据表。开销小,加锁快,不会发生死锁。锁冲突几率大,并发性能低。
  • 行锁:锁定某个或某些行。开销大,加锁慢,会发生死锁。锁冲突几率小,并发性能高。
  • 页表:介于表锁和行锁之间。

不难发现,表锁和行锁的特点基本是相反的,从应用场景上来说,表锁更适合以查询为主,只有少量按索引条件更新数据的应用;而行锁更适合有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用。

MyISAM支持表锁;InnoDB支持表锁和行锁

  • 开销:维护锁是要占用内存的。
  • 加锁速度:如果是表锁,咔嚓一下就锁住了;如果是行锁,要找到需要加锁的行,再加锁。
  • 关于死锁,后面会详细讲

2.2. 按加锁方式

按加锁方式可分为共享锁(S Lock)和排他锁(X Lock);共享锁是读锁,排他锁是写锁,所以有人如是说:共享读锁,排他写锁。表、页和行都可以加共享锁和排他锁,下面以行锁为例说明规则

  • 如果一个事务T获得了行R的共享锁,那么其他事务可以获得该行的共享锁,但是不能获得该行的排他锁
  • 如果一个事务T获得了行R的共享锁,那么事务T只能对行R进行读操作
  • 如果一个事务T获得了行R的排他锁,那么其他事务不能获得该行的任和锁
  • 如果一个事务T获得了行R的排他锁,那么事务T能对行R进行读和写操作

2.3. 多粒度锁定--意向锁

InnoDB支持多粒度锁定,这种锁定允许事务在行级上锁和表级上的锁同时存在。为此,InnoDB支持一种额外的锁方式,即意向锁。在InnoDB中,意向锁是表级别的锁,有意向共享锁(IS Lock)和意向排他锁(IX Lock)两种。规定在事务在请求S锁和X锁前,需要先获得对应的IS、IX锁。意向锁是由存储引擎自己维护的,用户无需手动操作意向锁。

意向锁的作用:意向锁用于快速判断表锁和行锁之间是否有冲突。事务T在加表锁之前,要检查此表上是否已经有表锁或行锁,如果已经存在表锁,事务T立即阻塞。如果没有表锁,就要检查是否有行锁,这个过程效率很低,因为需要遍历整张表一行一行地检查。如果有了意向锁,任何事务在获取行锁之前必须先获得意向锁(表级别的),那么事务T发现表上已经被加了意向锁,就知道表中的某些行必然已经被锁,也就避免了遍历全表去检查。

3. InnoDB的行锁

InnoDB的行锁是加在索引之上的,这意味着只有通过索引条件检索数据,才会使用行锁,否则将使用表锁;不同的是Oracle数据库的行锁加在数据行上[2]。主要注意的是,不能仅仅通过where子句判断是否会用到索引,而是要看具体的执行计划。另外,当按照辅助索引检索数据时,对应的主键索引的索引项也会加上锁。

3.1. 行锁的3种算法

InnoDB存储引擎有3种行锁的算法,分别是

  • Record Lock:单个行记录上的锁
  • Gap Lock:间隙锁,锁定一个范围,但不包括记录本身
  • Next-Key Lock:Gap Lock + Record Lock,锁定一个范围,包括记录本身

3.2. Next-Key Lock

采用Next-Key Lock的锁定技术称为Next-Key Locking,锁定命中的区间+下一个区间。Next-Key Lock是范围查找且命中记录时,InnoDB的默认行锁算法,可以把Record Lock和Gap Lock看作是它的降级/退化。其设计目的是为了解决幻读问题。例如有一个索引有10,11,13和20这四个值,那么可能被锁定的区间为:

如果一个事务T通过辅助索引查询11,那么锁定的范围是(10,11 ]和(11,13 ];如果通过辅助索引查询20,那么锁定的范围是(13,20 ]和(20, ]。注意,当通过主键索引/聚簇索引/唯一索引查询时候,因为此索引不允许有重复值,所以不必担心插入重复值导致幻读,所以InnoDB会对Next-Key Lock进行优化,将其降级为Record Lock,只锁查询记录本身。使用不存在的检索条件进行等值查询,使用Gap Lock,左开右开区间。对于范围查询,则会用Next-Key Lock。【这些的前提是用到了索引,即用到了行锁】

4. 死锁TODO

5. 总结

(1)InnoDB的行锁是加在索引之上的,这意味着只有通过索引条件检索数据,才会使用行锁,否则将使用表锁;

(2)InnoDB在可重复度隔离级别下,通过Next-Key Lock解决幻读问题;

(3)当通过主键索引/聚簇索引/唯一索引查询时候,InnoDB会对Next-Key Lock进行优化,将其降级为Record Lock。

引用资料

[1]《MySql技术内幕--InnoDB存储引擎》第二版.姜承尧

[2] MySQL中的锁(表锁、行锁)

[3] 阿里P6+的Mysql锁机制二面试总结,值得收藏

面试必会 MySql的锁机制(InnoDB)相关推荐

  1. Mysql的锁机制之表锁

    Mysql的锁机制之表锁 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计算资源(如CPU,RAM,I/O等)的争用外,数据也是一种供许多用户共享的资源,如何保证数据并发访 ...

  2. MySQL调优(八):查缺补漏(mysql的锁机制,读写分离,执行计划详解,主从复制原理)

    mysql的锁机制 1.MySQL锁的基本介绍 ​ 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共 ...

  3. mysql默认锁机制是什么_MySQL中锁机制的原理是什么

    MySQL中锁机制的原理是什么 发布时间:2020-12-08 14:48:30 来源:亿速云 阅读:81 作者:Leah MySQL中锁机制的原理是什么?针对这个问题,这篇文章详细介绍了相对应的分析 ...

  4. mysql 释放行锁_《深入精通Mysql(三)》深入底层Mysql各种锁机制(面试必问)...

    我们知道,数据也是一种供许多用户共享访问的资源.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素.从这一角度来说,锁对于数据库而言 ...

  5. MySQL数据库锁机制之MyISAM引擎表锁和InnoDB行锁详解

    MySQL中的锁概念 Mysql中不同的存储引擎支持不同的锁机制.比如MyISAM和MEMORY存储引擎采用的表级锁,BDB采用的是页面锁,也支持表级锁,InnoDB存储引擎既支持行级锁,也支持表级锁 ...

  6. MySQL数据库读现象 数据库锁机制 Innodb存储引擎行级锁

    数据库读现象 数据库管理软件的"读现象"指的是当多个事务并发执行时,在读取数据方面可能碰到的问题,包括有脏读.不可重复读和幻读. 创建数据表 # 创建数据表 create tabl ...

  7. mysql更新锁机制_mysql查询更新时的锁表机制分析

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁 ...

  8. 【MySQL】深入浅出剖析mysql事务锁机制 - 笔记

    事务的基本概念 事务的特点(ACID) 快照:之前的某一个历史的状态(类比虚拟机的快照),用于实现原子性 隔离性:通过锁机制来实现 锁:共享锁,排它锁,独占锁,临键锁,间隙锁,自增锁,意向锁 持久性: ...

  9. mysql insert锁机制

    一.前言 上周遇到一个因insert而引发的死锁问题,其成因比较令人费解. 于是想要了解一下insert加锁机制,但是发现网上介绍的文章比较少且零散,挖掘过程比较忙乱. 本以为只需要系统学习一个较完全 ...

  10. 对比Oracle和Mysql在锁机制上的类似和差异点

    转:https://blog.csdn.net/c332472988/article/details/52804078 InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,这 ...

最新文章

  1. 线程间操作无效: 从不是创建控件的线程访问它
  2. 拓展小知识(一)——使用 CSS 和 JS 加载阿里小图标
  3. 集成学习算法之boosting、bagging和随机森林算法原理
  4. 使用计算机加密码,给正使用的电脑设置密码
  5. 小程序·云开发实战 - 迷你微博
  6. 语音专题第四讲,语音识别之解码器技术简介|大牛讲堂
  7. NKOJ1472 警卫安排
  8. unity 特效shader下载_Unity shader消融特效——(1)逻辑节点篇
  9. PHP简单留言板代码
  10. 工艺过程卡片,工序卡片,工艺卡,刀具卡区别
  11. 华为交换机系统软件升级和安全漏洞修复教程
  12. python主函数_Python main() 函数
  13. 60秒学脑科学常识:《科学美国人》专栏文集
  14. 基于pytorch的OCR识别库
  15. kbd通达2017版破解后,自定义菜单无法调用表单开启流程/kbdkbd 错误,请联系管理员 /general/approve_center/new/insert.php/kbd
  16. ios8在通用设置中文键盘无效的解决方法(中文键盘设置)
  17. 完整目标检测项目流程——从使用LabelImg标注到使用YOLOv5训练测试
  18. MT2503原理图芯片资料整合下载,MT2503处理器概述
  19. 为什么用抓包工具看HTTPS包是明文的
  20. 有些工具程序员不用也要掌握(想到就写,不定期更新)

热门文章

  1. Angular2 小贴士 Name
  2. 处理ionic项目中,输入框的光标不自动定位,键盘不弹出的问题
  3. zabbix创建ITEM,运算语法
  4. 2013中国微信公众平台用户研究报告
  5. 阿里云服务器连接ftp服务(软件的使用)
  6. for循环与each的区别
  7. 运用SQL Server安全模型来保护数据
  8. Sparsity and Some Basics of L1 Regularization
  9. java流意外结束_java – POI – null之后的文件意外结束
  10. android fresco 存储,Android使用Fresco之下载图片(包括GIF图)