概述

表级锁是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. h5 图片上传旋转问题

    https://blog.csdn.net/netdxy/article/details/51518494 https://www.cnblogs.com/liu-fei-fei/p/5974403. ...

  2. [原题复现]HCTF 2018 Warmup(文件包含)

    HCTF 2018 Warmup 原题复现:https://gitee.com/xiaohua1998/hctf_2018_warmup 考察知识点:文件包含漏洞(phpmyadmin 4.8.1任意 ...

  3. js 进度条效果

    <!DOCTYPE html><html><head><meta charset="utf-8"><title>< ...

  4. codeforces 1426F,初学者也能做,div3的最难题

    大家好,欢迎阅读codeforces专题. 今天选择的题目是Div3比赛的最后一题,也是最难的一道题.选这道题的主要原因是帮助大家建立信心,因为有些小伙伴给我反应说之前选择的题目有些难了,觉得自己可能 ...

  5. Linux高可用之Keepalived

    1: 安装keepalived yum install -y keepalived ipvsadm 安装keepalived和LVS管理软件ipvsadm 主机与备机都需要安装 ######修改配置文 ...

  6. 虚拟机VM15 Ubuntu18.04写第一个c程序并实现ssh连接

    输入"su",再输入密码进入根用户 1.开启ssh服务 /etc/init.d/ssh start 若没有安装会出现: (1).安装ssh apt-get install open ...

  7. Android自带图标库

    Java Usage example: myMenuItem.setIcon(android.R.drawable.ic_menu_save); Resource Usage example: and ...

  8. 题解 洛谷 P3396 【哈希冲突】(根号分治)

    根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...

  9. unity官网安装教程

    于今天起记录与回忆游戏开发相关一些小目标 2020-12-01 第一篇正式的博客就从软件的安装开始吧 unity个人版是免费的不用刻意去找破解版什么的 unity官网安装 1.unity.cn uni ...

  10. PyQt(Python+Qt)学习随笔:QTreeView树形视图的indentation属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeView树形视图的indentation属性用于控制视图中每级数据项之间的缩进,对于顶级项 ...