这里还要区分锁中容易令人混淆的概念lock与 latch。在数据库中,lock与 latch都可以被称为“锁”。但是两者有着截然不同的含义,本章主要关注的是lock。

latch一般称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在 InnoDB存储引擎中, latch又可以分为 mutex(互斥量)和 rwlock(读写锁)。其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测的机制。
lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务 commit或 rollback后进行释放(不同事务隔离级别释放的时间可能不同)。此外,lock,正如在大多数数据库中一样,是有死锁机制的。下表显示了lock与latch的不同。

lock与 latch的比较
  lock latch
对象 事务 线程
保护 数据库内容 内存数据结构
持续时间 整个事务过程 临界资源
模式 行锁、表锁、意向锁 读写锁、互斥量
死锁 通过 waits-for graph、 time out等机制进行无死锁检测与处理机制。 无死锁检测与处理机制。仅通过应用程序加锁的顺序(lock leveling)保证无死锁的情况发生
存在于 Lock Manager的哈希表中 每个数据结构的对象中

对于 InnoDB存储引擎中的 latch,可以通过命令SHOW ENGINE INNODB MUTEX来进行查看。

mysql> show engine innodb mutex;
+--------+-----------------------------+----------+
| Type   | Name                        | Status   |
+--------+-----------------------------+----------+
| InnoDB | rwlock: dict0dict.cc:2685   | waits=1  |
| InnoDB | rwlock: dict0dict.cc:1183   | waits=91 |
| InnoDB | rwlock: fil0fil.cc:1381     | waits=1  |
| InnoDB | rwlock: log0log.cc:838      | waits=81 |
| InnoDB | rwlock: btr0sea.cc:195      | waits=1  |
| InnoDB | sum rwlock: buf0buf.cc:1460 | waits=12 |
+--------+-----------------------------+----------+
6 rows in set (0.17 sec)

在 Debug版本下,通过命令SHOW ENGINE INNODB MUTEX可以看到 latch的更多信息,如图所示。

通过上述的例子可以看出,列Type显示的总是 InnoDB,列Name显示的是 latch的信息以及所在源码的位置(行数)。列 Status比较复杂,在 Debug模式下,除了显示 os_waits,还会显示 count、 spin_waits、spin_rounds、os_yields、os_wait_times等信息。其具体含义见下表。

命令SHOW ENGINE INNODB MUTEX输出结果说明
名称 说明
count mutex被请求的次数
spin_waits spin lock(自旋锁)的次数,InnoDB存储引擎latch在不能获得锁时首先进行自旋,若自旋后还不能获得锁,则进入等待状态
spin_rounds 自旋内部循环的总次数,每次自旋的内部循环是一个随机数。 spin rounds/spain waits表示平均每次自旋所需的内部循环次数
os_waits 表示操作系统等待的次数。当 spin lock通过自旋还不能获得 latch时,则会进入操作系统等待状态,等待被唤醒
os_yields 进行 os_thread_yield唤醒操作的次数
os_wait_times 操作系统等待的时间,单位是ms

上述所有的这些信息都是比较底层的,一般仅供开发人员参考。但是用户还是可以通过这些参数进行调优。
相对于 latch的查看,lock信息就显得直观多了。用户可以通过命令 SHOW ENGINE INNODB STATUS及 information_schema架构下的表 INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS来观察锁的信息。

【MySQL技术内幕】34-lock与latch相关推荐

  1. 读书笔记之MySQL技术内幕

    前言 本文内容基本摘抄自<MySQL技术内幕 InnoDB存储引擎>,以供复习之用,没有多少参考价值.想要更详细了解请参考原书. 第一章.MySQL体系结构和存储引擎 数据库是物理操作系统 ...

  2. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02 6. 锁 ​ 人们认为行级锁总会增加开销.实际上,只有当实现本身会增加开销时,行级锁才会增加开销.InnoDB 存储引擎不需要锁升级,因 ...

  3. Mysql技术内幕InnoDB存储引擎——InnoDB存储引擎

    特此申明: 前段时间找工作所以看了<Mysql技术内幕InnoDB存储引擎>,整理的时候除了参考网上已有的笔记贴,加上自己整合的,可能和别人有雷同之处.不过无所谓啦,写出来自己看看,需要的 ...

  4. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01 1. MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库database: 物理操作系统文件或其他形式文件类型的集合. 当使 ...

  5. MySQL技术内幕 InnoDB存储引擎:锁问题(脏读、不可重复读)

    1.脏读 在理解脏读(Dirty Read)之前,需要理解脏数据的概念.但是脏数据和之前所介绍的脏页完全是两种不同的概念.脏页指的是在缓冲池中已经被修改的页,但是还没有刷新到磁盘中,即数据库实例内存中 ...

  6. MySQL必知必会教程:深入理解MySQL技术内幕

    2019独角兽企业重金招聘Python工程师标准>>> MySQL必知必会教程:深入理解MySQL技术内幕 作为最流行的开源数据库软件之一,MySQL数据库软件已经是广为人知了.当前 ...

  7. mysql技术内幕sampdb_MySQL技术内幕汇总

    MySql技术内幕之MySQL入门(1) 检查系统中是否已经安装了MySQL sudo netstat -tap | grep mysql 若没有显示已安装结果,则没有安装.否则表示已经安装. sud ...

  8. mysql技术内幕sampdb_MySql技术内幕之MySQL入门(1)

    MySql技术内幕之MySQL入门(1) 安装 检查系统中是否已经安装了MySQL sudo netstat -tap | grep mysql 若没有显示已安装结果,则没有安装.否则表示已经安装. ...

  9. Mysql技术内幕innodb引擎笔记

    第2章 InnoDB存储引擎 2.3 InnoDB体系架构 InnoDB存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构. 缓 ...

  10. 文章阅读——Mysql技术内幕

    mysql官方文档:https://dev.mysql.com/doc 第一章 mysql体系结构和存储引擎 1.1 定义数据库和实例 数据库:物理操作系统文件或其他形式文件类型的集合. 实例:MyS ...

最新文章

  1. 扩增子统计绘图3热图:样品相关分析,差异OTU/ASV
  2. 中国林科院亚热带林业研究所林木根际微生物博士后招聘启事
  3. 极客Web前端开发资源大荟萃#007
  4. Go to sleep
  5. java 文件字节流_Java:文件字符流和字节流的输入和输出
  6. js node.js 编写命令工具demo
  7. 在mysql表中如何变换列和行_在SQL中转换列和行的简单方法?
  8. apache maven安装教程
  9. 怎样用计算机计算矩阵,【活用工具】教你如何用卡西欧fx82es计算机计算复数 矩阵等...
  10. mac 连接android手机调试,mac连接华为手机,无法真机调试。
  11. VM虚拟机占内存非常大
  12. Java笔记——08.面向对象(中级)
  13. 是怎么回事?沉浸式体验反倒是局限虚拟现实
  14. java 调用 yed 绘制 流程图_流程图绘制软件──yEd
  15. 数字转换成大写人民币
  16. 三分钟学会数据库, replace() 替换
  17. ASP.NET 权限管理 页面静态化 OA系统培训 三层架构
  18. 龙人直线电话计费系统
  19. 匈牙利算法求解指派问题(C++代码)
  20. [Javascript 高级程序设计]学习心得记录 函数参数传递与引用

热门文章

  1. 自己动手写CPU——寄存器堆、数据存储器(基于FPGA与Verilog)
  2. 样本量太小怎么做结构方程模型?
  3. 【Docker系列】从头学起 Docker——docker run 命令详解
  4. 1小时学会通过Java Swing Design设计java图形化
  5. 广义表详解(C语言版)
  6. python爬虫实践(三)——爬取煎蛋网图片
  7. 不限机型,手机端实时玩转3D、混合现实,快手Y-tech有黑科技(已开源)
  8. 数据结构和算法经典书籍
  9. highCharts3D圆柱图的使用
  10. 用c语言编程一个英尺转换器,C语言中关于英尺、英寸、厘米的换算