MySQL(二)锁 ----- 表锁

MySQL 表锁定详解:LOCK TABLE WRITE 和 LOCK TABLE READ MySQL 提供了表级锁定机制,允许用户显式锁定表以控制并发访问。和是两种基本的表锁定方式。 阅读详情

前言

MySQL 里面的锁大致可以分成全局锁,表级锁,行锁
这儿将讲一下表级锁

表级锁

MySQL 里面表级别的锁有两种:

  • 表锁,
  • 元数据锁(meta data lock,MDL)。

表锁

  • lock tables 表名 read;
    #该表可以读,不能ddl 和 dml 中增删改,只能读取表数据
  • lock tables 表名 write;
    #既不能读,也不能写
    在这里插入图片描述
表锁的语法是 lock tables … read/write。

与 FTWRL 类似,可以用 unlock tables 主动释放锁,也可以在客户端断开的时候自动释放。需要注意,lock tables 语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象。

举个例子, 如果在某个线程 A 中执行 lock tables t1 read, t2 write; 这个语句,则其他线程写 t1、读写 t2 的语句都会被阻塞。同时,线程 A 在执行 unlock tables 之前,也只能执行读 t1、读写 t2 的操作。连写 t1 都不允许,自然也不能访问其他表。

在还没有出现更细粒度的锁的时候,表锁是最常用的处理并发的方式。而对于 InnoDB 这种支持行锁的引擎,一般不使用 lock tables 命令来控制并发,毕竟锁住整个表的影响面还是太大

MDL 锁

MDL作用是防止DDL和DML并发的冲突 ,保证读写的正确性

另一类表级的锁是 MDL(metadata lock)。MDL 不需要显式使用,在访问一个表的时候会被自动加上。MDL 的作用是,保证读写的正确性。你可以想象一下,如果一个查询正在遍历一个表中的数据,而执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结果跟表结构对不上,肯定是不行的。

因此,在 MySQL 5.5 版本中引入了 MDL,当对一个表做增删改查操作的时候,加 MDL读锁;当要对表做结构变更操作的时候,加 MDL 写锁

  • 读锁之间不互斥,因此你可以有多个线程同时对一张表增删改查。

  • 读写锁之间、写锁之间是互斥的,用来保证变更表结构操作的安全性。因此,如果有两个线程要同时给一个表加字段,其中一个要等另一个执行完才能开始执行。

虽然 MDL 锁是系统默认会加的,但却是你不能忽略的一个机制。

比如下面这个例子,我经常看到有人掉到这个坑里:给一个小表加个字段,导致整个库挂了。

肯定知道,给一个表加字段,或者修改字段,或者加索引,需要扫描全表的数据。在对大表操作的时候,你肯定会特别小心,以免对线上服务造成影响。而实际上,即使是小表,操作不慎也会出问题。我们来看一下下面的操作序列,假设表 t 是一个小表。

在这里插入图片描述

注: 表t 是 innodb 表,mysql版本是5.7.24 自动提交开启
1. sessionA:
begin;
select * from t limit 1;
 
2. sessionB:
select * from t limit 1;
 
3. sessionC:
alter table t add f int;
#会mdl锁住
 
4. sessionD:
select * from t limit 1;

在这里插入图片描述
show full processlist 查看mdl 锁详情
在这里插入图片描述
我们可以看到 session A 先启动,这时候会对表 t 加一个 MDL 读锁。由于 session B 需要的也是 MDL 读锁,因此可以正常执行。

之后 session C 会被 blocked,是因为 session A 的 MDL 读锁还没有释放,而 sessionC 需要MDL 写锁,因此只能被阻塞。

如果只有 session C 自己被阻塞还没什么关系,但是之后所有要在表 t 上新申请 MDL 读锁的请求也会被 session C 阻塞。前面说了,所有对表的增删改查操作都需要先申请MDL 读锁,而这时读锁没有释放,对表alter ,产生了mdl写锁,把表t锁住了,这时候就对表t完全不可读写了。

如果某个表上的查询语句频繁,而且客户端有重试机制,也就是说超时后会再起一个新session 再请求的话,这个库的线程很快就会爆满。

事务中的 MDL 锁,在语句执行开始时申请,但是语句结束后并不会马上释放,而会等到整个事务提交后再释放。
注 : 一般行锁都有锁超时时间。但是MDL锁没有超时时间的限制,只要事务没有提交就会一直锁注。

怎么解决了这个MDL锁

提交或者回滚这个事务。所以要找到这个事务

怎么找到这个事务, 通过information_schema.innodb_trx 查看事务的执行时间

# 查看事务超过60s的事务
mysql> select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60\G;
trx_started 表示什么时候执行的这个事务
 
#查看系统当前时间
mysql> select now();

在这里插入图片描述
事务开始时间和系统现在时间,一看事务执行了这么久。

查看这个线程id
在这里插入图片描述

怎么处理了这个长事务的线程id了

首先看show full processlist; 中host 哪个字段 ,到底是谁连接了数据库。例:我上面是localhost环境,进去commit或者/rollback ,哪如果不是localhost 环境了,是程序连接了这时候就要kill掉了

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

首先我们要解决长事务,事务不提交,就会一直占着 MDL 锁。在 MySQL 的information_schema 库的 innodb_trx 表中,你可以查到当前执行中的事务。如果你要做 DDL 变更的表刚好有长事务在执行,要考虑先暂停 DDL,或者 kill 掉这个长事务。这也是为什么需要在低峰期做ddl 变更,当然也要考虑具体做什么ddl,参考官方的online ddl。

online ddl 过程

  1. 拿MDL写锁
  2. 降级成MDL读锁
  3. .真正做DDL
  4. 升级成MDL写锁
  5. 释放MDL锁

1、2、4、5如果没有锁冲突,执行时间非常短。第3步占用了DDL绝大部分时间,这期间这个个表可以正常读写数据,是因此称为”online”

W5500 MACRAW模式实战:在ESP32上抓取并解析原始以太网数据包 本文详细介绍了如何在ESP32开发板上使用W5500芯片的MACRAW模式捕获和解析原始以太网数据包。通过硬件连接指南、代码实现示例和协议解析技巧,帮助开发者深入理解网络通信底层机制,实现网络嗅探和自定义协议开发等高级应用。 阅读详情

相关推荐

Alipay 支付唤起 h5 测试

测试地址 https://recharge.apps.oppomobile.com/recharge-center/recharge/?from=message try { //唤起客户端快捷参数 var data = {"requestType":"SafePay","fromAppUrlScheme":"alipays","dataString":"h5_ro...

六桥风月IT随笔 1万+

mysql中lock tables与unlock tables(锁表/解锁)使用总结

先说结论: LOCK TABLES为当前线程锁定表。 UNLOCK TABLES释放被当前线程持有的任何锁。当线程发出另外一个LOCK TABLES时,或当服务器的连接被关闭时,当前线程锁定的所有表会自动被解锁。 如果一个线程获得在一个表上的一个READ锁,该线程和所有其他线程只能从表中读。 如果一个线程获得一个表上的一个WRITE锁,那么只有持锁的线程READ或WRITE表,其他线程被阻止。 正文: php mysql lock tables 使用有感 mysql 的 表锁 lock ta.

HD243608836的博客 1万+

S7-200SMART系列全套接线说明

SMART200接线方法,输入,输出,模拟量,面板,扩展糟等,并且详细说明接线原理。

文都龙哥 1万+

Linux下的服务器和客户端、会话

screen screen是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序。用户还可以使用screen服务程序同时在多个远程会话中自由切换,能够做到实现如下功能。 会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。 多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。 会话共享:当多个用户同时登录到远程服务器时,便可以

A147254的博客 599

RK3568+XS9922B+Android11双模视频输入:CVBS与AHD兼容驱动开发实战

本文详细介绍了基于RK3568平台和XS9922B解码芯片,在Android11系统上开发支持CVBS与AHD双模视频输入的兼容驱动实战。内容涵盖硬件选型、内核驱动框架分析、双模信号自动识别与配置、视频通道切换实现及图像质量优化等关键技术点,为车载监控等需要兼容新旧摄像头的项目提供完整解决方案。

js777的博客 378

Qt开发实战:QWebEngineView缓存路径详解与自定义配置(Windows/Linux)

本文详细解析了Qt框架中QWebEngineView组件的缓存机制,提供了Windows和Linux系统下的默认缓存路径及自定义配置方案。通过实战代码示例,展示了如何实现跨平台缓存路径管理、权限设置以及企业级应用中的多用户隔离策略,帮助开发者有效管理Web内容缓存,提升应用性能和数据安全性。

weixin_42519826的博客 403

07 | 行锁功过:怎么减少行锁对性能的影响?

在上一篇文章中,我跟你介绍了MySQL的全局锁和表级锁,今天我们就来讲讲MySQL的行锁。 MySQL的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。InnoDB是支持行锁的,这也是MyISAM被InnoDB替代的重要原因之...

weixin_33841722的博客 294

Keil5安装多版本共存方案:实用技巧分享

分享Keil5安装过程中实现多版本共存的实用方法,解决开发环境冲突问题。通过合理配置路径与版本管理,让keil5安装更高效稳定,提升嵌入式开发体验。

weixin_42514750的博客 1525

MySQL 中 LOCK TABLES(手动锁表) 语句的详细说明,包括语法、使用场景、示例代码及注意事项

MySQL 中 LOCK TABLES 语句的详细说明,包括语法、使用场景、示例代码及注意事项

爱的叹息的专栏 1511

TL494充电器原理与维修 (转)

TL494充电器原理与维修 电动自行车充电器多采用开关 电源,型号虽多,但电路结构大同小异,主要区别在于所选的脉宽调制(PWM)芯片不同如(UC3845、UC3842、SG3524、TL494)。现以佳腾牌 充电器为例,介绍其原理和故障检修方法。 一、电路原理 根据实物测绘的佳腾牌充电器电路原理如图1所示。整机可分为PWM产生和推动电路、功 率开关变换电路、...

weixin_30500663的博客 1814

PowerBI启动故障排查:环境变量与兼容性设置全指南

本文详细解析了PowerBI启动故障的常见问题,如空白界面和闪退,并提供了环境变量修改与兼容性设置的全方位解决方案。通过调整WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS环境变量和设置兼容模式,有效解决PowerBI启动问题,提升软件运行稳定性。

weixin_29255731的博客 470

MySQL的表锁问题(二)——InnoDB表锁问题

首先补充下MySQL的表锁问题(一)没讲到的系统可以通过设置max_write_lock_count参数来控制写的优先级,当一个表的读锁达到这个数的时候,MySQL会暂时的,降低写的优先级.MySQL尽量少用一些看似精妙但复杂的语句,因为你复杂可能导致给表加的读锁时间就长,会导致写的操作无法进行. innodb和MyISAM最大的区别在于innodb支持事务处理和行级锁,行级锁带来的好处是可以支

i am a dummy 1万+

科研绘图系列:R语言绘制世界地图数据分布(world map)

科研绘图系列:R语言绘制世界地图数据分布(world map)

专注生信领域 527

【MySQL】MySQL锁(二)表锁与行锁测试

MySQL锁(二)表锁与行锁测试上篇文章我们简单的了解了一大堆锁相关的概念,然后只是简单的演示了一下 InnoDB 和 MyISAM 之间 表锁 与 行锁 的差别。相信大家还是意犹未尽的,今天我们就来用代码说话,实际地操作一下,看看如何进行手动的加 表锁 与 行锁 ,并进行一些相关的实验测试。手动锁表首先来看 锁表 相关的操作。一般来说,我们手动锁表大部分情况下是为了增加从库或者进行数据迁移的时候...

硬核项目经理 764

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MySQL学习笔记二:全局锁、表锁、MDL锁、行锁

数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。 全局锁 全局锁就是对整个数据库实例加锁。可以通过命令 Flush tables with read lock (FTWRL) 对全局进行加锁,让整个库处...

Kim_ 1743

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MySQL(二):详解MyIsam表锁

1、MySQL锁基本介绍 锁是计算机协调多个进程或线程并发访问某一个资源的机制。在数据库层面,除传统的计算机资源(CPU、RAM、I/O等)的争用之外,数据也是一种供多用户共享的资源。如何保证数据并发访问的一致性和有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言尤其重要,也更加复杂。 相对于其他的数据库,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如:MyIsam和Memory存储引擎采用的是表级锁(tab

健身变秃,coding变强 1291

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

MySQL并发机制(二)——表锁

表的共享、独占锁: 共享锁: 类似于 JUC 下的 ReentrantReadWriteLock 下的 读锁。多个事务可以同时为数据加锁,同时访问到数据。 独占锁: 类似于 JUC 下的 ReentrantReadWriteLock 下的 写锁。同一时间,只能有一个事务获取为数据加锁。 只能有一个事务访问到数据 不同存储引擎的锁: 默认情况下:在对某个表执行SELECT、INSERT、DELETE、UPDATE语句时 (1): InnoDB是不会为这个表添加表级别的 S锁 或者 X锁 .

m0_47027420的博客 456

mysql表copy锁表吗_MySQL锁(二)表锁:为什么给小表加字段会导致整个库挂掉?...

概述表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。MySQL 中表级锁有两种:一种是表锁,另一种是元数据锁(meta data lo...

weixin_31940053的博客 702

mysql新增字段会锁表_MySQL锁(二)表锁:为什么给小表加字段会导致整个库挂掉?...

概述表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。MySQL 中表级锁有两种:一种是表锁,另一种是元数据锁(meta data lo...

weixin_39997037的博客 1982

mysql加字段会锁表_MySQL锁(二)表锁:为什么给小表加字段会导致整个库挂掉?...

概述表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。MySQL 中表级锁有两种:一种是表锁,另一种是元数据锁(meta data lo...

weixin_28788181的博客 821

mysql表可以锁字段吗_MySQL锁(二)表锁:为什么给小表加字段会导致整个库挂掉?...

概述表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。MySQL 中表级锁有两种:一种是表锁,另一种是元数据锁(meta data lo...

weixin_39769183的博客 217

mysql添加字段多少数据量会锁表_MySQL锁(二)表锁:为什么给小表加字段会导致整个库挂掉?...

概述表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。MySQL 中表级锁有两种:一种是表锁,另一种是元数据锁(meta data lo...

weixin_30232185的博客 1180

【MySQL】说透锁机制(二)行锁 加锁规则 之 范围查询(你知道会锁表吗?

作为过来人,小编是整理了很多进阶架构视频资料、面试文档以及PDF的学习资料,针对上面一套系统大纲小编也有对应的相关进阶架构视频资料abc < 20;![在这里插入图片描述](https://img-blog.csdnimg.cn/8926f79c06d14043a888fdccfb664d91.png)这里共匹配2条abc=10的记录。所以共上了 6 把锁,3把锁在**普通索引**上:1. abc = 20 (向右扫描到的第一个不匹配记录): Next-key Lock;

2401_85111662的博客 1148
上一篇: MySQL(一)锁 ----- 全局锁
下一篇: MySQL(三)锁 ----- 行锁和锁机制
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值