InnoDB 锁的类型

一、全局锁
mysql> flush table with read lock;
FTWRL 会对整个实例加只读锁。会阻塞所有线程读以外的所有操作。查看线程状态 State: Waiting for global read lock
通常 对全库做逻辑备份(mysqldump)时,会加全局锁。
(1)如果在主库上执行逻辑备份,备份期间会阻塞实例所有写操作。
(2)如果在备库上执行逻辑备份,备份期间会阻塞所有 binlog 的回放,导致复制延迟。
对于事务表的逻辑备份,因为支持事务一致性视图,可以避免 全局读锁。对于非事务的 MyISAM 表备份时,则无法避免 global read lock。
二、表级锁
表级锁有两种:表锁 和 MDL 锁
1. 表锁
mysql> lock table t1 read; 所有线程只能读 t1,写阻塞,DDL 阻塞。包括当前线程。查看线程状态 State: Waiting for table metadata lock
当前线程写 t1 会报错:
mysql> delete from t1 where id=6;
ERROR 1099 (HY000): Table 't1' was locked with a READ lock and can't be updated
其他线程写 t1 会阻塞:
mysql> lock table t1 write; 其他线程读写 t1 阻塞,DDL t1 阻塞。查看线程状态 State: Waiting for table metadata lock
当前线程读写 t1 不阻塞,DDL t1 不阻塞:
mysql> delete from t1 where id=6;
mysql> alter table t1 add column "hobby" varchar(5);
但当前线程也不允许读写 其他表 eg: t ,会报错:
mysql> select * from t limit 1; delete from t where id=1;
ERROR 1100 (HY000): Table 't' was not locked with LOCK TABLES
可见,表锁的影响还是挺大的,InnoDB 通常不会触发表锁,因为太影响并发性能了。
2. MDL 锁
MDL 锁不需要显示添加,对进行 DML 操作的时候会自动在该表加 MDL 读锁,DDL 加 MDL 写锁,读写互锁斥。另外需要说明的是,MDL 锁是事务中语句开始执行的时候添加的,直到该事务提交才会释放。一般情况下,我们不需要太关注 MDL 锁,但一些特殊情况需要有了解。
(1)在有活跃事务或者高并发的的表上执行 DDL 操作:
| session A | session B | session C | session D | |
|---|---|---|---|---|
| T1 | mysql> begin; select * from t1 where id=1; |
|||
| T2 | mysql> select * from t1 where id=1; | |||
| T3 | mysql> alter table t1 add index(age); blocked |
|||
| T4 | mysql> select * from t1; blocked |
session A 的 DML 操作,首先会在表 t1 上加 MDL 读锁,但还未提交事务。因为 MDL 读锁之间兼容,所以 session B 的操作不会被阻塞。session C DDL添加所引,要先获取 MDL 写锁,因为读写锁互斥,所以 session C 会被 block 住,等待 表图 t1 上的MDL 读锁释放。 但此时,session C 也会阻塞他之后 表 t1 上的所有 DML,DDL 语句,看起来像是锁表了一样,直到 session A 提交释放读锁,C, D 才会执行成功。
在 有长事务,垃圾 SQL,或高并发的表上执行 DDL 操作,需要引起注意,可能会导致 MDL 锁等待的问题。
在 session A 中不显示开启事务,直接模拟垃圾 sql: mysql> select *,sleep(120) from t1 where id=1; 同样能验证 MDL 锁等待的问题。
InnoDB 锁的类型的更多相关文章
- Innodb锁的类型
Innodb锁的类型 行锁(record lock) 行锁总是对索引上锁,如果某个表没有定义索引,mysql就会使用默认创建的聚集索引,行锁有S锁和X锁两种类型. 共享锁和排它锁 Innodb锁有两种 ...
- innodb 锁分裂继承与迁移
innodb行锁简介 行锁类型 LOCK_S:共享锁 LOCK_X: 排他锁 GAP类型 LOCK_GAP:只锁间隙 LOCK_REC_NO_GAP:只锁记录 LOCK_ORDINARY: 锁记录和记 ...
- InnoDB锁机制分析
InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过 ...
- Innodb锁机制:Next-Key Lock 浅谈
数据库使用锁是为了支持更好的并发,提供数据的完整性和一致性.InnoDB是一个支持行锁的存储引擎,锁的类型有:共享锁(S).排他锁(X).意向共享(IS).意向排他(IX).为了提供更好的并发,Inn ...
- [转载] 数据库分析手记 —— InnoDB锁机制分析
作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工 ...
- Innodb锁机制:Next-Key Lock 浅谈(转)
http://www.cnblogs.com/zhoujinyi/p/3435982.html 数据库使用锁是为了支持更好的并发,提供数据的完整性和一致性.InnoDB是一个支持行锁的存储引擎,锁的类 ...
- MySQL · 特性分析 · innodb 锁分裂继承与迁移
http://mysql.taobao.org/monthly/2016/06/01/ innodb行锁简介 行锁类型 LOCK_S:共享锁 LOCK_X: 排他锁 GAP类型 LOCK_GAP:只锁 ...
- Innodb 锁系列2 事务锁
上一篇介绍了Innodb的同步机制锁:Innodb锁系列1 这一篇介绍一下Innodb的事务锁,只所以称为事务锁,是因为Innodb为实现事务的ACID特性,而添加的表锁或者行级锁. 这一部分分两篇来 ...
- MySQL- InnoDB锁机制
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...
随机推荐
- maven转web项目时 在Project Facets下转换时 Further configuration available没有出现
如果下边的 further configuration available不出来 把Dynamic web module 去掉勾选,应用与项目,然后再点开项目的properties,再选中Dynami ...
- Docker 与 K8S学习笔记(二十二)—— 高效使用kubectl的小技巧
kubectl作为我们主要的操作K8S的工具,其具备非常丰富的功能,但是如果不经过打磨,使用起来还是存在诸多不便,今天我们来看看如何将我们的kubectl打磨的更加易用. 一.命令自动补全 kubec ...
- Spring中声明式事务的几个属性的解释
声明式事务 @Transactional (通常用在service层)事务属性:传播行为,隔离级别,回滚,只读,过期 1,spring支持事务传播行为:propagation(常用以下两个) ① ...
- 一文说透https中的s是什么?
一.HTTP 与 HTTPS 有哪些区别? 1. HTTP 是超文本传输协议,信息是明文传输,存在安全风险.HTTPS ,是在 TCP 和网络层之间加入了 SSL/TLS 安全协议,也就是安全套接字层 ...
- Netty源码解析一——线程池模型之线程池NioEventLoopGroup
本文基础是需要有Netty的使用经验,如果没有编码经验,可以参考官网给的例子:https://netty.io/wiki/user-guide-for-4.x.html.另外本文也是针对的是Netty ...
- systemd配置文件填写了ExecStop=/usr/bin/kill -9 $MAINPID之后重启在messages发生了报错
原因在于systemd模块需要增加自动化检测,检测有一项为检测messages日志内是否有systemd的failed 写了一个检测脚本,脚本的检测messages内容为/bin/cat /var/l ...
- 【计理01组04号】JDK基础入门
java.lang包 java.lang包装类 我们都知道 java 是一门面向对象的语言,类将方法和属性封装起来,这样就可以创建和处理相同方法和属性的对象了.但是 java 中的基本数据类型却不是面 ...
- Bypass BeaconEye - Beacon 堆混淆
这是[信安成长计划]的第 9 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 CS4.5 Sleep_Mask 0x02 HeapEncrypt 0x03 效果 0x04 参考文章 ...
- [题解]UVA10700 Camel trading
链接:http://vjudge.net/problem/viewProblem.action?id=21358 描述:给出一个算式,算式里面有加法和乘法,可以任意添加括号从而改变计算顺序.求可能得到 ...
- 可视化里程碑:可拖拽使用的可视化BI工具
在数据量越来越大的今天,如何利用好数据,更好的为人类社会服务,成为人们所关心的话题,而其中数据可视化作为最后一个环节,也是人们最为直观的感受,自然而然备受重视.同质化的应用越来越多,应用开发者也开始在 ...