概述

表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。

特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

MySQL 中表级锁有两种:一种是表锁,另一种是元数据锁(meta data lock, MDL)。

表锁

表锁的语法是 lock tables...read/write。与 FTWRL 类似,可以使用 unlock tables 主动释放锁,或者在客户端断开链接时自动释放。

在还没有出现更细粒度的锁之前,表锁是最常用于处理并发的。而对 InnoDB 这种支持行锁的引擎,一般不使用 lock tables 命令来控制并发。

MDL

另一类表级的锁是MDL。MDL不需要显式使用,在访问一个表的时候会被自动加上。

在MySQL 5.5版本中引入MDL,当对一个表做 CURD 时,加 MDL 读锁;当要对表做 DDL 时,加 MDL 写锁;

  • 读锁之间不互斥。
  • 读写锁之间、写锁之间互斥。

有时候给一个小表加个字段,可能会导致整个库挂掉。假设表 t 是一个小表。




图1 给表 t 加字段

会话A加了 MDL 读锁;会话B也加了 MDL 读锁,可以正常执行;会话C被阻塞,等待会议A释放 MDL 读锁。

如果只是会话C被阻塞倒没关系,但之后所有在表 t 上新申请MDL 读锁都会被会议C阻塞。也就是这个表现在完全不能读写了。

如何安全地给小表加字段?

很简单,在 ALTER TABLE 加等待时间。如果超过等待时间后,操作回滚。

MariaDB 已经合并了 AliSQL 的这个功能,所以这两个开源分支目前都支持 DDL NOWAIT/WAIT n 这个语法。

ALTER TABLE tbl_name NOWAIT add column ...
ALTER TABLE tbl_name WAIT N add column ...

参考资料

MySQL锁(二)表锁:为什么给小表加字段会导致整个库挂掉?的更多相关文章

  1. mysql优化二之锁机制

    mysql优化二之锁机制 mysql提供了锁机制和MVCC机制来保证并发操作的安全性,这里主要讨论锁机制, MVCC见下篇文章 mysql的锁按照锁粒度可分为行锁与表锁,按照操作类型划分可读锁和写锁 ...

  2. MySQL高级知识(十六)——小表驱动大表

    前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...

  3. Mysql实战45讲 06讲全局锁和表锁:给表加个字段怎么有这么多阻碍 极客时间 读书笔记

    Mysql实战45讲 极客时间 读书笔记 Mysql实战45讲 极客时间 读书笔记 笔记体会: 根据加锁范围:MySQL里面的锁可以分为:全局锁.表级锁.行级锁 一.全局锁:对整个数据库实例加锁.My ...

  4. MySQL 全局锁和表锁

    根据加锁的范围,MySQL 里面的锁大致可以分成全局锁,表级锁,行锁. 行锁已经在前面几篇文章说过 1. 全局锁 全局锁就是对整个数据库实例加锁.MySQL 提供了一个加全局读锁的方法,命令是Flus ...

  5. 数据库并发事务控制四:postgresql数据库的锁机制二:表锁 <转>

    在博文<数据库并发事务控制四:postgresql数据库的锁机制 > http://blog.csdn.net/beiigang/article/details/43302947 中后面提 ...

  6. MySQL数据库的全局锁和表锁

    1.概念 数据库锁设计的初衷是处理并发问题.作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则.而锁就是用来实现这些访问规则的重要数据结构. 2.锁的分类 根据加锁的范围, ...

  7. mysql 原理~ 乐观锁和悲观锁

    一 简介:今天咱们来聊聊悲观锁和乐观锁 二 悲观锁  1 定义   在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC” ...

  8. MySQL如何安全的给小表加字段

    MySQL学习笔记-如何安全的给小表加字段 如果要给一个大表加字段,你一般都会非常谨慎小心,以免对线上业务造成影响,但实际上给一个小表加字段不慎操作也会导致线上业务出问题,这篇文章主要学习一下MySQ ...

  9. java多线程:并发包中ReentrantLock锁的公平锁原理

    一:锁的原理结构 (1)锁对象内部维护了一个同步管理器的对象AbstractQueuedSynchronizer,AbstractOwnableSynchronizer (2)该对象其实是一个抽象类, ...

随机推荐

  1. HDU100题简要题解(2080~2089)

    //2089之前忘做了,周二C语言课上做,至于2086,写题解的时候突然发现之前的做法是错的,新的解法交上去CE,等周二再弄吧,其余题目暂时可以放心 HDU2080 夹角有多大II 题目链接 Prob ...

  2. powertool

    powertool简介 PowerTool 一款免费强大的进程管理器,支持进程强制结束,可以Unlock占用文件的进程,查看文件/文件夹被占用的情况,内核模块和驱动的查看和管理,进程模块的内存的dum ...

  3. Boom 3D快捷方式,让3D音效应用更便捷

    快捷方式是一种快速启动程序.打开程序功能的方法,巧妙地利用快捷键,可以大大加快我们使用Boom 3D的速度,可以让我们更好地享受3D音效. 接下来,就让小编演示一下怎么在不打开Boom 3D的情况下使 ...

  4. vulnhub: DC 3

    通过nmap扫描,只开放了80端口,并且该web服务是基于Joomla搭建: root@kali:~# nmap -A 192.168.74.140 Starting Nmap 7.80 ( http ...

  5. DIV滚动条设置添加 CSS滚动条显示与滚动条隐藏

    <!DOCTYPE html> <html> <head> <meta charset="gb2312" /> <title& ...

  6. QQ账号测试用例

  7. win10安装jenkins忘记密码的解决方法

    jenkins安装完了一直没用,突然想学习的时候,忘记了登陆密码. 一:修改配置文件 1. 打开jenkins的安装目录,选择users下面的admin目录下的config.xml文件   我的文件路 ...

  8. Contest 1428

    A 移动次数是 \(\left|x_1-x_2\right|+\left|y_1-y_2\right|\). 如果 \(x_1\not=x_2\) 且 \(y_1\not=y_2\) 说明要换方向,两 ...

  9. Crossing River 题解(贪心)

    题目链接 题目大意 t组数据(t<=20) 给你n个人(n<=1000)过河,每个人都有权值,一条船,每次船最多运2个人,每次的花费为两个人的较大花费 求所有人都过河需要的最小花费 题目思 ...

  10. django项目运行步骤

    第一步: 创建gjango项目 django-admin startproject dname python manage.py startapps aname 第二部: 运行 -- 编辑设置 -- ...