MySQL 锁(lock与latch)
一、什么是锁
锁机制用于管理对共享资源的并发访问,它是数据库系统区别于文件系统的一个关键特性。
数据库系统使用锁是为了支持对共享资源的并发访问,提供数据的完整性和一致性。
InnoDB存储引擎锁的实现和Oracle数据库非常类似,提供一致性的非锁定读、行级锁支持。行级锁没有相关额外的开销,并发可以同时得到并发性和一致性。
二、锁的种类Lock与Latch
1、Latch是闩锁(轻量级的锁)
因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在InnoDB存储引擎中,latch又可以分为mutex(互斥量)和rowlock(读写锁)。其主要目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测机制。
查看方式:
show engine innodb mutex
2、Lock的对象是事务
用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或rollback后释放。此外,lock有死锁机制。
查看方式:
show engine innodb status
表:innodb_trx,innodb_locks,innodb_lock_waits
3、lock与latch比较

三、InnoDB存储引擎中的锁
1、锁的类型
1)共享锁(S)
2)排他锁(X)
3)S锁与X锁的关系
从表中可以发现X锁与任何的锁都不兼容,而S锁仅和S锁兼容。需要特别注意的是,S和X锁是行锁,兼容是指对同一记录(row)锁的兼容性情况。

4)意向锁
InnodDB支持多粒度锁定,这种锁定允许事务在行级别上的锁和表级别上的锁同时存在。
为了支持不同粒度上进行加锁,有了一种而外的锁方式,称之为意向锁。
意向共享锁
意向排他锁
意向锁与行锁兼容性

5)查看锁的方式与SQL
show engine innodb status;
查看锁表情况
show status like ‘Table%’;
查看正在被锁定的的表
show OPEN TABLES where In_use > 0;
查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
查看当前执行的SQL
show processlist;
2、一致性非锁定读
1)一致性非锁定读(consistent nonlocking read)是指InnoDB通过行多版本控制(multi version ing control)的方式来读取当前执行时间数据库中行的数据。如果行上面存在update、delete操作,这是读取操作不会因此等待行上的索引释放。而是区读取行的一个快照,不需要等待X锁释放。如图

2)快照数据是指该行的前版本的数据,该实现是通过UNDO段来完成。而undo用来在事务中回滚数据,因此快照数据本身是没有额外的开销。此外,读取快照数据是不需要上锁的,因为没有事务需要对历史的数据进行修改操作。
3)MVCC(Multi Version Concurrency Control,MVCC)
快照数据其实是当前数据之前的历史版本,每行记录可能有多个版本。一个行记录可能有不止一个快照版本,一般称这种技术为多版本技术。由此带来的并发控制,称之为多版本并发控制。
3、一致性锁定度
InnoDB支持两种一致性锁定读
1)select ...from update 这个是X锁
2) select ... lock in share mode 这个是S锁
3)注意点
一致性锁定读必须在一个事务中,当事务提交了,锁就释放了。
因此,使用上述两个select锁定语句,必须加上begin,start transaction或者set autocommit=0。
4、自增长锁
1)插入操作会根据这个自增长的计数器值加1赋予自增长列。这个实现方式称为AUTO-INC Locking.这种锁其实是采用一种特殊的表锁机制,为了提高插入的性能,锁不是在每一个事务完成后才释放,而是在完成对自增长插入的SQL语句后立即释放。
2)虽然AUTO-INC Locking从一定程度上提高了并发插入的效率,但是还是存在性能上的问题。首先对于有自增长值的列的并发插入性能较差,事务必须等待前一个插入的完成(虽然不用等待事务的完成)。其次对于INSERT ....SELECT的大数据量的插入会影响插入的性能,因为另一个事务的插入会被阻塞。
3)从MySQL 5.1.22版本开始,InnoDB提供了一种轻量级互斥量的自增长实现机制,这种机制大大提高了自增长插入的性能。并且从这个版本开始,InnoDB提供了一个参数innodb_autoinc_lock_mode来控制自增长的模式,该参数的默认值为1,在继续讨论新的自增长实现方式之前,需要对自增长的插入进行分类。

接着分析参数innodb_autoinc_lock_mode以及各个设置下对自增的影响,其共有3个有效值可以设定 0 1 2

5、外键和锁
1)为什么加外键锁
因为外键值得插入或更新,首先需要查询父表中得记录,即select父表。但是对与父表得select操作,不是使用一致性非锁定读得方式吧,因为这样会发生数据不一致得问题。因此,采用select .... lock in share mode得方式,即主动对父表加一个S锁。如果这时父表上已经有X锁,子表操作被阻塞。
2)InnoDB解决方式
在建外键时InnoDB自动对其加一个索引,可避免表锁。Oracle需要用户自己手动加,不加可能引发死锁。
四、锁的算法
锁有三种算法:Record Lock,Gap lock,next-key lock
1、Record Lock
Record lock总是回去锁定索引记录,如果InnoDB存储引擎在建表得时候没有设置任何一个索引,那么这时InnoDB使用隐式得主键来进行锁定。
2、Gap lock
间隙锁,锁定一个范围,但是不包含记录本身。
3、next-key lock
1)结合Gap lock与Record lock得一种锁定算法,其设计目的时解决phantom Problem。它锁定得不是单个值,而是一个范围。采用Next-key Lock的锁定技术称为Next-key Locking。
2)当查询的索引含有唯一属性时,InnodDB存储引擎会对Next-key lock进行优化,将其降级为Record Lock,即仅锁住索引本身,而不是范围。
3)若唯一索引由多个列组成,而查询只是查找多个唯一索引列中的其中一个,那么查询其实是range类型查询,而不是point类型查询,故InnoDB存储引擎依然使用Next-Key Lock进行锁定。
4)用户可以使用以下两种方式显示的关闭Gap Lock
将事务隔离级别设置为Read Committed
将参数innodb_locks_unsafe_for_binlog设置为1
5)查询注意事项
在没有使用唯一索引作为检索条件,导致不光锁定了索引记录,还锁定了索引之间的间隙,应该是是使用了next-key锁。
五、锁的问题
锁提高了并发,但是会带来潜在的问题。不过好在因为事务隔离级别的要求,锁只会带来三种问题,如果可以防止三种情况发生,那么将不会产生异常。
1、脏读
1)脏数据是指未提交的数据,如果读到了脏数据,即一个事务可以读取另一个事务中未提交的数据,则显然违反了数据库的隔离性。
2、不可重复度
3、
六、阻塞
七、锁的问题
八、死锁
九、锁升级
MySQL 锁(lock与latch)的更多相关文章
- MySQL中lock与latch的区分
这里要区分锁中容易令人混淆的概念lock与latch.在数据库中,lock与latch都可以成为锁,但两者有截然不同的含义 latch 一般称为闩锁(轻量级的锁) 因为其要求锁定的时间非常短,若迟勋时 ...
- 锁&lock与latch
锁是数据库系统区别于文件系统的一个关键特性.锁机制用于管理对共享资源的并发访问.Innodb不仅仅使用行锁,也会在数据库内部其它地方使用锁,从而允许对多种不同资源提供并发访问.如:操作缓冲池中的LRU ...
- mysql中lock tables与unlock tables(锁表/解锁)使用总结
php mysql lock tables 使用有感 mysql 的 表锁 lock tables 感觉就像一个 封闭的空间 mysql发现 lock tables 命令的时候,会将带有锁标记的表(t ...
- Mysql错误: ERROR 1205: Lock wait timeout exceeded解决办法(MySQL锁表、事物锁表的处理方法)
Java执行一个SQL查询未提交,遇到1205错误. java.lang.Exception: ### Error updating database. Cause: java.sql.SQLExc ...
- Mysql 锁基础
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/53 lock与latch 在数据库中,lock与latch都可以 ...
- MySQL锁系列之锁的种类和概念
转自:http://keithlan.github.io/2017/06/05/innodb_locks_1/ 锁是MySQL里面最难理解的知识,但是又无处不在. 一开始接触锁的时候,感觉被各种锁类型 ...
- MySQL 锁(完整版)
目录 锁总览 锁的作用 加锁流程 锁对数据库的影响 锁等待 死锁 锁类型 锁范围 锁方式 全局锁 全局读锁 全局QC锁 QC锁存在的问题: 备份锁 backup lock MDL锁 MDL锁类型 MD ...
- MySQL锁:02.InnoDB锁
目录 InnoDB锁 InnoDB行锁实现机制 InnoDB隐式.显式锁 InnoDB锁类型 共享锁 排他锁 意向锁 InnoDB锁兼容性 InnoDB行锁范围.粒度 InnoDB行锁粒度一览 意向插 ...
- mysql锁机制 读书笔记
目录 MySQL锁机制 1.什么是锁 2.lock与latch 3.InnoDB存储引擎中的锁 3.1锁的类型 3.2 一致性非锁定读 3.3 一致性锁定读 4 锁的算法 4.1行锁的3中算法 4.2 ...
随机推荐
- python3 字符集的应用
python3的字符集测试 s_test=u"严" print(s_test.encode('gbk')) print([s_test]) #print(s_test[]) #pr ...
- Django路由配置
Django路由配置系统.视图函数 1.路由配置系统(URLconf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是 ...
- docker 的常用命令汇总
- python 正则 re模块(详细版)
正则表达式 什么是正则表达式? 正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合 ...
- S03_CH07_AXI_VDMA_OV5640摄像头采集系统
S03_CH07_AXI_VDMA_OV5640摄像头采集系统 7.1概述 本章内容和<S03_CH06_AXI_VDMA_OV7725摄像头采集系统>只是摄像头采用的分辨率不同,其他原理 ...
- 【爬虫集合】抖音API分析
1. 分析接口 Charles注册码 Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4 抖音API分析 抖音.猫眼网页 ...
- .NET Core使用swagger遇到的坑
今天突然点开写好的接口,突然发现展开时同时展开了两个接口.如图 我点这两个接口任意一个,这两个都会同时展开或折叠. 原因是他们actinName相同,虽然在vs里面只要http方法不同,action是 ...
- Asp.Net Core 轻松学系列-5利用 Swagger 自动生成接口文档
目录 前言 结语 源码下载 前言 目前市场上主流的开发模式,几乎清一色的前后端分离方式,作为服务端开发人员,我们有义务提供给各个客户端良好的开发文档,以方便对接,减少沟通时间,提高开发效率:对 ...
- Java 之 IDEA 的 Debug 追踪
使用 IDEA 的断点调试功能,查看程序的运行过程. 1.在有效代码行,点击行号右边的空白区域,设置断点,程序执行到断点将停止,我们可以手动来运行程序 2.点击 Debug 运行模式 3.程序停止在断 ...
- Android开发之图像处理那点事——滤镜
在Android开发中,一般对图像的处理就是Bitmap(位图),它包含了图像的全部数据,即点阵和颜色值,点阵就是包含像素点的矩阵,而颜色值就是ARGB,分别代表透明.红色.绿色.蓝色通道,它们共同决 ...