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):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...
随机推荐
- C++输入多行数据
动机 编程题常用需求,比如输入两行数据. 解决思路:使用getline 程序 #include <iostream> #include <vector> #include &l ...
- 编译安装haproxy
一.安装lua环境 1.1 安装依赖包 [root@centos7 ~]# yum install gcc readline-devel 1.2 下线lua源码包并解压 [root@centos7 ~ ...
- 编译安装基于fastcgi模式的多虚拟主机的wordpress和discuz的LAMP架构
一.环境准备 两台主机: httpd+php(fastcgi模式) mariadb 服务器 软件版本: mariadb-10.2.40-linux-x86_64.tar.gz apr-1.7.0.ta ...
- 国产操作系统deepin安装与配置Node-RED环境
1.1. 测试机配置清单 部件名称 版本号 备注 处理器 Intel Core i5 3320M 显卡 自带集显 内存 8G DDR3单通道 显示插口 VGA*1,HDML*1 1.2. 系统安装及配 ...
- Oracle - Trunc() 函数截取日期&截取数值
Oracle TRUNC函数可以截取数字和日期类型:截取日期:select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; --显示当前时间 s ...
- alpakka-kafka(10)-用kafka实现分布式近实时交易
随着网上购物消费模式热度的不断提高,网上销售平台上各种促销手段也层出不穷,其中"秒购"已经是各种网站普遍流行的促销方式了."秒购"对数据的实效性和精确性要求非常 ...
- MLHPC 2016 | Communication Quantization for Data-parallel Training of Deep Neural Networks
本文主要研究HPC上进行数据并行训练的可行性.作者首先在HPC上实现了两种通信量化算法(1 Bit SGD以及阈值量化),然后提出了自适应量化算法以解决它们的缺点.此外,发挥出量化算法的性能,作者还自 ...
- Spring Data JPA应用之常规CRUD操作初体验
基于对于一个陌生的技术框架,先使用后研究其实现的原则(大部分本人如此,就如小朋友学习骑自行车不会先研究自行车是怎么动起来的而是先骑会了),对于Spring JPA先通过案例实践其怎么用吧. 用之前得明 ...
- 继承及super关键字
继承 继承的本质是对某一批类的抽象,从而实现对世界更好的建模 extend的意思是"扩展",子类是父类的扩展. Java中类只有单继承,没有多继承:儿子只能有一个亲生爸爸,一个爸爸 ...
- Python+selenium自动循环送贺卡
Python源代码如下: # coding=utf-8 from selenium import webdriver from time import sleep from random import ...