mysql autocommit0_autocommit=0引起的业务hang住
背景
有用户报告一个普通的select 语句被hang住了,执行超时。查明之后发现是autocommit使用不当导致。
这里将case简化,说明复现步骤及原因。
复现
session1 建表并插入数据:
create table if not exists t(id int primary key, c int);
set autocommit=0;
insert into t values(1,1);
insert into t values(2,2);
insert into t values(3,3);
commit;
select count(*) from t;
这个执行流程的目的很直观,建表、插入数据、查询结果。貌似没有问题。
维持session1不断,新建一个连接session2,执行 create table if not exists t(id int primary key, c int);
此时该语句处于等待状态.
再新建一个连接session3, 执行select count(*) from t; 该语句处于等待状态.
于是从业务上看就是一个select 语句被hang住。
原因分析
MySQL Tips: 如果服务中某些语句无法执行完成,追查问题时第一步要先保留现场,pstack > tmplog之一个常用的方法。
这两个等待线程的栈如:
#0 0x000000310ce0b7bb in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x000000000063ba46 inMDL_wait::timed_wait(THD*, timespec*, bool, char const*) ()
#2 0x000000000063e095 in MDL_context::acquire_lock(MDL_request*, unsigned long) ()
可以看到,堵在MDL_wait.
简单说明下什么是MDL。试想,如果一个语句在执行一个表上的查询过程中,表结构被改了,或者表被drop,这样会得到一个错误的结果。因此在一个事务持续期间,就需要对访问的表结构作保护。这个就是meta data lock (MDL).
很容易理解的,对表数据作增删改查,需要对MDL加读锁,修改表结构、删除表等操作则加写锁。
MySQL Tips: MDL是5.5才加入的机制,5.1版本下本文的case不会复现。
MySQL Tips:事务中MDL申请时机是在首次使用时,释放时机是在事务结束后。
也就是说文章开头的这个case,原因是session2等待在加写锁过程。而session3虽然只是加读锁,但与session2冲突,也需要等待。
session1的事务
也就是说session1还持有表t的MDL读锁。但我们的事务明明已经提交(commit)了。这里就涉及到一个常见的误解。以前有看过文章说,可以用set autocommit=0开启一个事务。其实这个描述不准确.
MySQL Tips: set autocommit=0是将本线程设置为非自动提交模式。在每个事务结束后,下个语句开始时自动新建一个事务。
这就意味着,session1最后的那个select count(*)操作,实际上之前隐含了一个begin操作。由于该事务没有提交,因此session1持有表t的MDL读锁。
因此对于业务方的建议就是,及时提交这些读事务,或断开连接。
MySQL Tips: 连接断开时,MySQL会自动回滚当前未提交的事务。
由于本case里面session1的最后一个事务只是一个select语句,因此回滚不影响业务。
小结
1) 显式的启动事务的方法是begin或start transaction; 提交事务的方法是commit;
2) set autocommit=0的好处是在频繁开启事务的场景下,减少一次begin的交互。
3) 注意set autocommit=0修改了线程变量,会影响本线程存活期间的事务行为。
4) set autocommit=1可以提交事务并改变值。
mysql autocommit0_autocommit=0引起的业务hang住相关推荐
- 警惕参数变化,MySQL 8.0 升级避免再次踩坑
MySQL 8.0新特性专栏目录 <MySQL开发规范>过时了,视图查询性能提升了一万倍 你真的会用EXPLAIN么,SQL性能优化王者晋级之路 索引三剑客之降序索引和不可见索引 千呼万唤 ...
- MySQL 执行DDL语句 hang住了怎么办?
MySQL 执行DDL语句 hang住了怎么办? 不要慌,先点支烟,听我娓娓道来! 前两天,早上7点多的时候,抓起手机忽然看到了圈内的一则DDL语句 hang住的案例,阅读到文末,发现文中留有一些疑问 ...
- c++排查线程hang住_Kafka学习笔记之kafka高版本Client连接0.9Server引发的血案排查 - 时光飞逝,逝者如斯...
0x00 概述 kafka server虽然原则上是兼容详细的client,但只是高版本的Server端兼容低版本的Client端: 在有高版本Client端连接时,会导致低版本Server集群会ha ...
- mysql 备库 hang住_mysql主键的缺少导致备库hang住
最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的 ...
- 10.2.0.4 RAC hang住的分析-从ash基表数据查出RLM$EVTCLEANUP job异常
记录一下之前的一次故障排查过程. 用户反映8点左右业务部分反映应用卡,8点多以后应用无法进行,用户DBA紧急重启了数据库实例,之后数据库系统恢复正常. 了解到这是一套AIX+两节点10.2.0.4版本 ...
- mysql客户端hang_MySQL所有操作hang住了,怎么破?
<MySQL所有操作hang住了,怎么破?>要点: 本文介绍了MySQL所有操作hang住了,怎么破?,希望对您有用.如果有疑问,可以联系我们. 作者介绍 王松磊,现任职于UCloud,从 ...
- mysql 解决慢sql_MySQL被慢sql hang住了,用shell脚本快速清除不断增长的慢sql的办法...
某个初级dba误删index,mysql漫山遍野全是10S以上的慢sql,mysql服务被hang住了,而且慢sql不断在增加中,如果手动在mysql界面kill的话,根本来不及,这个时候,shell ...
- oracle删除表不等待,oracle故障处理之删除大表空间hang住
背景 数据库分区表数据越来越大,需要对过期话的数据进行迁移,以及大的分区表需要进行数据的清理和删除,达到释放磁盘空间的目的. 问题说明 环境:linux 6.X 数据库:oracle 11.2.0.4 ...
- oracle关闭rs,Oracle 关闭(shutdown immediate)时hang住
昨天晚上生产的两套10.2.0.4的数据库修改了参数,需要重启.在发出shutdown immediate命令后等了大概10分钟的时间,数据库还没有down下来.检查后台alert日志,发现从开始sh ...
最新文章
- linux nmon
- 2018蓝桥杯省赛java_蓝桥杯2018年A组省赛
- Qt文档阅读笔记-Qt工作笔记-QThread解析与实例(主线程发送信号给子线程)
- .NET字符串格式化的几种方法及@符号的使用
- MAgent安装及初步试验
- 1079. Total Sales of Supply Chain (25)-求数的层次和叶子节点
- kafkatemplate无法注入_SpringBoot 整合 Spring-Kafka 深度踩坑实战
- 软考信息系统项目管理师知识点总结2
- Hilbert变换简要剖析
- 计算机控制液压同步顶升系统,变频控制同步顶升液压系统
- 弦理论是如何解决量子力学和相对论间的矛盾
- Unity http协议连接封装简易版(已测试可用)
- 不定积分、定积分的区别与联系
- 整理最全的“大数据”学习资源
- android adb interface驱动安装
- Unity PIC 打包assetBundle报错
- discuz的htm模板代码分析
- 计算机题库一级第四,计算机一级题题库,第四章Excel
- Python-排序进阶(cmp_to_key)
- LeetCode 455[Python]. 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
热门文章
- 2023年南京航空航天大学英语笔译专业考研上岸前辈备考经验
- 视频加字幕怎么做?分享几种视频加字幕方法
- Android深入四大组件(七)Android8.0 根Activity启动过程(后篇)
- windows oracle重建监听,Windows下修改Oracle监听端口
- mysql手机版_Mysql管理安卓版下载-Mysql管理appv1.4 最新版-腾牛安卓网
- 实例变量和类变量、类方法和实例方法
- Labrika评测:AI工具做网站页面SEO内容优化
- 网络媒体十八种赢利模式
- 为撒电大计算机专业学籍出来的慢,2021年网络教育学籍什么情况下会被取消了...
- 考研数学学习思维导图