Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >DML+DDL 导致死锁?

DML+DDL 导致死锁?

作者头像
王小明_HIT
发布于 2023-09-07 01:18:00
发布于 2023-09-07 01:18:00
55200
代码可运行
举报
文章被收录于专栏:程序员奇点程序员奇点
运行总次数:0
代码可运行

DML+DDL 导致死锁?

最近线上出现了 DDL执行过程中,出现死锁问题,导致系统DB访问异常,排查后,发现是DML+DDL出现了死锁问题。

SQL一共4种类型

  1. 数据定义语言 DDL:Create、Drop、Alter 操作。用于定义库和表结构的。
  2. 数据查询语言 DQL:select。用于查询数据的。
  3. 数据操纵语言 DML:insert、update、delete。对行记录进行增删改操作。
  4. 数据控制语言 DCL:grant、revoke、commit、rollback。控制数据库的权限和事务。

MDL

MDL(MetaData Lock)就是针对于 DDL 与 DML、DQL 操作加锁,执行 DDL 自动添加写锁,执行 DML、DQL 自动添加读锁,也就是说 DML 语句可以同时执行(不考虑其他锁),而 DDL 间则会相互阻塞。

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

MDL的作用是保证读写的正确性。

这么个场景,如果一个查询正在遍历一个 表中的数据,而执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结果 跟表结构对不上,肯定是不行的。

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

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

DDL 为啥会加锁

DDL 在执行会先创建一个临时表,先将表的数据全部移到这个临时表中,然后再将临时表替换当前表。在这个过程中如果出现读写操作就会影响最终结果出错。这个过程耗时主要在将原表的数据移到临时表的过程。

mysql 锁兼容矩阵

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Request   |  Granted requests for lock                  |
 type     | S  SH  SR  SW  SWLP  SU  SRO  SNW  SNRW  X  |
----------+---------------------------------------------+
S         | +   +   +   +    +    +   +    +    +    -  |
SH        | +   +   +   +    +    +   +    +    +    -  |
SR        | +   +   +   +    +    +   +    +    -    -  |
SW        | +   +   +   +    +    +   -    -    -    -  |
SWLP      | +   +   +   +    +    +   -    -    -    -  |
SU        | +   +   +   +    +    -   +    -    -    -  |
SRO       | +   +   +   -    -    +   +    +    -    -  |
SNW       | +   +   +   -    -    -   +    -    -    -  |
SNRW      | +   +   -   -    -    -   -    -    -    -  |
X         | -   -   -   -    -    -   -    -    -    -  |

场景说明

应用:session1 客户端:session2 session1:

session2:

  1. session1: 开启事务,并执行查询,持有 XXX 对象的 SHARED_READ 锁,简称SR锁。
  2. session2: 执行添加分区(DDL)命令,想要获取 XXX 对象的 EXCLUSIVE 锁,简称X锁.
  3. 这个状态时,session2 在等 session1 释放锁。
  4. session1: 继续执行 update 命令,会申请 XXX 对象的 SHARED_WRITE 锁,简称SW锁。
  5. 这个状态时,session2 在等待获取 XXX 对象的X锁,session1 想要申请SW锁,必须等session2 释放掉锁。所以 session1 在等 session2 释放锁。

Session1 和 Session2 相互等待,发生死锁。

原因:X锁和SW锁的相互互斥的机制导致的死锁。

两个会话互相等待,发生死锁,MySQL数据库会自动回滚其中一个事务。

如何解决

1、在session1中的查询,加上for update, 使得session1 一开始就获取SW锁 2、将session1的查询独立出当前事务 3、优化mysql, 将DDL操作改写成软提交方式, 获取不到锁后,释放已经拿到的锁,然后不断重试

如何安全的给表执行 DDL 操作?

  1. 生产环境的任何大表或频繁操作的小表,ddl都要非常慎重,最好在业务低峰期执行。
  2. 设计上要尽可能避免大事务,大事务不仅仅会带来各种锁问题,还会引起复制延迟/回滚空间爆满等各类问题。
  3. 设置参数 lock_wait_timeout 为较小值,使被阻塞端主动停止。
  4. 增强监控告警,及时发现 MDL 锁。
  5. 或许这样操作也是一种好办法:按新结构创建新表 -> 将旧表数据迁移至新表 -> 重命名两个表(三步都通过编写sql语句完成,比手动作快,第二步的数据迁移操作视情况而定)`。过程中最好在没人用的时候操作
  6. 操作ddl之前,先用以下语句查一下有没有长事务:SELECT * FROM information_schema.INNODB_TRX;
  7. 多副本(主从、集群)下可以做热更新。

参考资料

  • https://blog.csdn.net/qq_35254185/article/details/95359460?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-95359460-blog-80424571.235%5Ev38%5Epc_relevant_default_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-95359460-blog-80424571.235%5Ev38%5Epc_relevant_default_base3&utm_relevant_index=2
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AD23导出PCB制板到嘉立创下单
keepoutlayer禁止布线层,定义了禁止布线层后,我们在以后的布线过程中,所布的具有电气特性的线是不可能超出禁止布线层的边界。说白了就是定义你板子的外形边界线。
云深无际
2024/08/20
1700
AD23导出PCB制板到嘉立创下单
现代Keli教程-教不了一点
Arm Compiler for Embedded 6 基于现代 LLVM 编译器框架。Arm Compiler 5 不基于 LLVM 编译器框架。
云深无际
2024/08/20
1330
现代Keli教程-教不了一点
深度学习 arm linux移植过程整理[通俗易懂]
因运行环境使用ubtun 18 所虚拟机下载的ubtun 18 下载比较慢的话可以更换国内镜像
全栈程序员站长
2022/11/08
3.8K0
运放正负两个输入端之间电容的作用
我以前抄过一块板子,在运放(INA类型)的正反输入引脚之间有一颗电容,我找了很久的资料也没有找到这是什么作用,昨夜看知乎偶然翻到一个解释,我觉得不管对不对,也算满足了我。
云深无际
2024/08/21
1.3K0
运放正负两个输入端之间电容的作用
C++函数返回结果为自定义类型
我看源码的时候,经常可以看到在一个函数的前面,就是在本身应该在放void,int这种的地方,却出现了指针,结构体,类等的东西。
云深无际
2022/11/29
1.7K0
C++函数返回结果为自定义类型
Linux的一些小知识
该部分内容摘抄自 http://c.biancheng.net/view/779.html
东风压倒西风
2022/07/17
4810
浅谈勒索病毒防护
在正式的聊这个之前,为了尽量缩短篇幅,我会先贴一下引用的地址: 解密工具汇总:https://blog.csdn.net/Richard_qi/article/details/115611034?sp
相柳
2022/04/25
1K0
浅谈勒索病毒防护
英伟达TX1 扩容(120G SSD)
其中[directory location] 为放置swap文件的地址,上面是:/home/yunswj/swap
云深无际
2021/11/04
7610
Python接口自动化测试自学路线
最近很多职场新人问我测试怎么学,接口自动化怎么做,我整理了接口自动化学习路线图,希望对你有用。
周辰晨
2023/03/02
6260
Python接口自动化测试自学路线
鼎阳SDS814+示波器升级选件
示波器上面有三个功能:电源分析+示波器+信号发生器,各有30次的机会,但是可以通过计算获得密钥。
云深无际
2024/08/21
3370
鼎阳SDS814+示波器升级选件
有爱有恨的MDL锁
MySQL 5.5 中就引入了metadata lock(元数据锁)。用于对管理 database objects(数据库对象)的并发访问,保证数据的一致性。
田帅萌
2018/08/14
6330
有爱有恨的MDL锁
mysql全局锁和表锁什么场景会用到?
数据库往往是多个用户或者客户端在连接使用的。这时,我们需要考虑一个新的问题:如何保证数据并发访问的一致性、有效性呢?
友儿
2022/09/11
8750
ssm总结
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
高大北
2023/01/01
4070
ssm总结
架构师技能5:深入MySQL原理-Waiting for table metadata lock引发系统崩溃
我们码农平时大多数时间都在撸码或者撸码的路上,很少关注mysql的一些底层原理,当出现问题时没能力第一时间解决问题,出现问题后不去层层剖析问题产生的原因,后续也就可能无法避免或者绕开同类的问题。因此不要单纯做Ctrl+c和Ctrl+V,而是一边仰望星空(目标规划),一边脚踏实地去分析每个问题。 在mysql系列专栏里面,我深入浅出的总结了mysql相关知识,感兴趣的话可以去阅读,有问题就可以随时相互交流学习。
黄规速
2022/04/14
1K0
架构师技能5:深入MySQL原理-Waiting for table metadata lock引发系统崩溃
MySQL Online DDL 原理和踩坑
导读:MySQL 的 DDL(Data Definition Language) 包括增减字段、增减索引等操作。在 MySQL 5.6 之前,MySQL 的 DDL 操作会按照原来的表复制一份,并做相应的修改。
码农架构
2021/07/08
9500
MySQL Online DDL 原理和踩坑
MySQL在并发场景下的优化手段
对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据库系统追求的目标,既要满足大量并发访问的需求又必须保证在此条件下数据的安全,为了满足这一目标大多数数据库通过锁和事务机制来实现,MySQL数据库也不例外。尽管如此我们仍然会在业务开发过程中遇到各种各样的疑难问题,本文将以案例的方式演示常见的并发问题并分析解决思路。
Bug开发工程师
2018/07/23
1.2K0
MySQL在并发场景下的优化手段
MySQL 在并发场景下的问题及解决思路
对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据库系统追求的目标,既要满足大量并发访问的需求又必须保证在此条件下数据的安全,为了满足这一目标大多数数据库通过锁和事务机制来实现,MySQL数据库也不例外。尽管如此我们仍然会在业务开发过程中遇到各种各样的疑难问题,本文将以案例的方式演示常见的并发问题并分析解决思路。
wangxl
2018/07/27
1.4K0
MySQL 在并发场景下的问题及解决思路
MetaData Lock 之三
一 简介 通过前面两篇文章的介绍,相信读到这里的各位对MDL 锁已经有了比较深入的了解了,本文将结合理论知识介绍几组MDL 锁的案例。 二 常见MDL 锁的场景 1 Waiting for global read lock 我们先构造一个Waiting for global read lock场景: session1: alter table t1 add c3 bigint; //大表执行需较长时间 session2: set global read only=on; //等待 查看
用户1278550
2018/08/09
7080
docker部署redis哨兵集群_redis部署安装
不去网站,也可以通过如下命令查看有那些镜像可用 Docker search 命令
全栈程序员站长
2022/11/02
5980
docker部署redis哨兵集群_redis部署安装
waiting for metadata lock对腾讯云从节点的影响及处理
某用户A反馈CDB实例读业务数据库没有响应,在控制台界面看到ro节点被剔除,剔除之前数据库监控上面cpu负载正常,活跃线程数出现大量的堆积;提单后,平台紧急介入,观察到ro节点出现大量的waiting for table metadata lock的报错。
vkyzhao
2020/12/21
1.3K0
waiting for metadata lock对腾讯云从节点的影响及处理
相关推荐
AD23导出PCB制板到嘉立创下单
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验