一、全局锁

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 锁的类型的更多相关文章

  1. Innodb锁的类型

    Innodb锁的类型 行锁(record lock) 行锁总是对索引上锁,如果某个表没有定义索引,mysql就会使用默认创建的聚集索引,行锁有S锁和X锁两种类型. 共享锁和排它锁 Innodb锁有两种 ...

  2. innodb 锁分裂继承与迁移

    innodb行锁简介 行锁类型 LOCK_S:共享锁 LOCK_X: 排他锁 GAP类型 LOCK_GAP:只锁间隙 LOCK_REC_NO_GAP:只锁记录 LOCK_ORDINARY: 锁记录和记 ...

  3. InnoDB锁机制分析

    InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过 ...

  4. Innodb锁机制:Next-Key Lock 浅谈

    数据库使用锁是为了支持更好的并发,提供数据的完整性和一致性.InnoDB是一个支持行锁的存储引擎,锁的类型有:共享锁(S).排他锁(X).意向共享(IS).意向排他(IX).为了提供更好的并发,Inn ...

  5. [转载] 数据库分析手记 —— InnoDB锁机制分析

    作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工 ...

  6. Innodb锁机制:Next-Key Lock 浅谈(转)

    http://www.cnblogs.com/zhoujinyi/p/3435982.html 数据库使用锁是为了支持更好的并发,提供数据的完整性和一致性.InnoDB是一个支持行锁的存储引擎,锁的类 ...

  7. MySQL · 特性分析 · innodb 锁分裂继承与迁移

    http://mysql.taobao.org/monthly/2016/06/01/ innodb行锁简介 行锁类型 LOCK_S:共享锁 LOCK_X: 排他锁 GAP类型 LOCK_GAP:只锁 ...

  8. Innodb 锁系列2 事务锁

    上一篇介绍了Innodb的同步机制锁:Innodb锁系列1 这一篇介绍一下Innodb的事务锁,只所以称为事务锁,是因为Innodb为实现事务的ACID特性,而添加的表锁或者行级锁. 这一部分分两篇来 ...

  9. MySQL- InnoDB锁机制

    InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...

随机推荐

  1. Redis性能管理

    Redis性能管理 目录 Redis性能管理 一.查看Redis内存使用 二.内存碎片率 三.内存使用率 四.避免内存交换发生的方法 1. Hash数据类型 1.1 HSET/HGET/HDEL/HE ...

  2. VUE动态生成table表格(element-ui)(新增/删除)

    (直接复制即可测试) 结构(红色部分 data/prop/v-model 数据绑定): <template> <el-table size="small" :da ...

  3. 【NetCore】依赖注入的一些理解与分享

    依赖注入 DI 前言 声明:我是一个菜鸟,此文是自己的理解,可能正确,可能有误.仅供学习参考帮助理解,如果直接拷贝代码使用造成损失概不负责. 相关的文章很多,我就仅在代码层面描述我所理解的依赖注入是个 ...

  4. Docker入门的亿点点学习

    前段时间花了些时间学习了亿点点docker,也算是入门了吧,顺便记了一下笔记拿出来分享给想要接触docker的兄弟们. 没有服务器的兄嘚可以去腾讯云或者阿里云领取免费的试用产品嗷,如果已经领取过了,又 ...

  5. 12、Linux基础--挂载磁盘步骤、流处理工具awk(正则 比较 逻辑 算数表达式 流程控制)

    笔记 1.晨考 1.用两种方法,实现将文件中的以# 开头的行把# 去掉 sed -r 's/^#//g' /etc/fstab cat /etc/fstab | tr -d '^#' 2.将文件中的H ...

  6. 搭建 Nginx 服务

    今日内容 上一篇测试 c出现问题 web 服务 部署 Nginx 内容详细 上一篇测试 NFS共享文件步骤 - 服务端 [root@backup ~]# yum install nfs-utils r ...

  7. netty系列之:Bootstrap,ServerBootstrap和netty中的实现

    目录 简介 Bootstrap和ServerBootstrap的联系 AbstractBootstrap Bootstrap和ServerBootstrap 总结 简介 虽然netty很强大,但是使用 ...

  8. 运行EXE文件,系统提示缺少api-ms-win-crt-runtime-l1-1-0.dll,解决方法!!

    api-ms-win-crt-runtime-l1-1-0.dll是一个Windows系统的应用程序拓展文件,也叫动态链接库文件.这个文件能帮助绝大多数用户解决在安装或启动部分游戏软件时出现计算机中丢 ...

  9. IDEA一键部署SpringBoot项目到服务器

    1. 安装Alibaba Cloud Toolkit插件 2. 配置部署环境 2.1 为本次部署设置一个名字 2.2 选择被部署文件的生成方式 IDEA提供了三种方式:Maven Build,Uplo ...

  10. 1. 堪比JMeter的.Net压测工具 - Crank 入门篇

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...