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):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...
随机推荐
- 交换机基本原理与VRP基础及操作
交换机基本原理与VRP基础及操作 目录 交换机基本原理与VRP基础及操作 一.数据链路层 1.数据链路层的位置 2.数据链路层的功能 二.以太网(Ethernet) 1.以太网的概念 2.MAC地址( ...
- Redis性能管理
Redis性能管理 目录 Redis性能管理 一.查看Redis内存使用 二.内存碎片率 三.内存使用率 四.避免内存交换发生的方法 1. Hash数据类型 1.1 HSET/HGET/HDEL/HE ...
- 【第二十三期】春招实习阶段性总结(阿里云已OC)
本人算是一个半路出家找工作的菜鸡了,现在手中阿里云云原生offer.百度度小满offer.腾讯PCG二面环节.美团点评等offer环节.希望我的经历分享能对各位或之后准备春招的同学有帮助. 个人背景 ...
- Windows微信清理工具v.3.0.1
Windows微信清理工具v.3.0.1 今天,我原创的Windows微信清理工具迎来最大更新! v.3.0.0更新内容: 1.使用tkinter重构GUI,界面更简单易用! 2.增加"清理 ...
- 四探循环依赖 → 当循环依赖遇上 BeanPostProcessor,爱情可能就产生了!
开心一刻 那天知道她结婚了,我整整一个晚上没睡觉,开了三百公里的车来到她家楼下,缓缓的抽了一支烟...... 天渐渐凉了,响起了鞭炮声,迎亲车队到了,那天披着婚纱的她很美,真的很美! 我跟着迎亲车队开 ...
- 网页外部注入vConsole调试
概要 本篇介绍一种十分方便的方法为网站添加 vConsole 调试(通过篡改请求外部注入的方式,不需要您是网站的拥有者,主要用于调试线上站点). 之前已经发过一篇<借助FreeHttp为任意 ...
- Golang Sync.WaitGroup 使用及原理
Golang Sync.WaitGroup 使用及原理 使用 func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.A ...
- XStream: Stream Processing Platform at Facebook
这是Facebook在FlinkForward2021上的一个talk, 主题如下 在前面的论文中分析了Facebook的实时计算引擎的设计和选型的考量,里面提到了Facebook的实时计算引擎为了满 ...
- 数据分析实际案例之:pandas在泰坦尼特号乘客数据中的使用
目录 简介 泰坦尼特号乘客数据 使用pandas对数据进行分析 引入依赖包 读取和分析数据 图形化表示和矩阵转换 简介 1912年4月15日,号称永不沉没的泰坦尼克号因为和冰山相撞沉没了.因为没有足够 ...
- Android蓝牙扫码连接时,防止Activity重启
集成了一个蓝牙的扫码枪,发现每次连接时,应用的当前Activity会销毁再次创建.调试了下, 没有监听到任何的事件,非常困惑.搜了一阵了解到是Android的一个机制. 某些设备配置可能会在运行时发生 ...