背景

有用户报告一个普通的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住相关推荐

  1. 警惕参数变化,MySQL 8.0 升级避免再次踩坑

    MySQL 8.0新特性专栏目录 <MySQL开发规范>过时了,视图查询性能提升了一万倍 你真的会用EXPLAIN么,SQL性能优化王者晋级之路 索引三剑客之降序索引和不可见索引 千呼万唤 ...

  2. MySQL 执行DDL语句 hang住了怎么办?

    MySQL 执行DDL语句 hang住了怎么办? 不要慌,先点支烟,听我娓娓道来! 前两天,早上7点多的时候,抓起手机忽然看到了圈内的一则DDL语句 hang住的案例,阅读到文末,发现文中留有一些疑问 ...

  3. c++排查线程hang住_Kafka学习笔记之kafka高版本Client连接0.9Server引发的血案排查 - 时光飞逝,逝者如斯...

    0x00 概述 kafka server虽然原则上是兼容详细的client,但只是高版本的Server端兼容低版本的Client端: 在有高版本Client端连接时,会导致低版本Server集群会ha ...

  4. mysql 备库 hang住_mysql主键的缺少导致备库hang住

    最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的 ...

  5. 10.2.0.4 RAC hang住的分析-从ash基表数据查出RLM$EVTCLEANUP job异常

    记录一下之前的一次故障排查过程. 用户反映8点左右业务部分反映应用卡,8点多以后应用无法进行,用户DBA紧急重启了数据库实例,之后数据库系统恢复正常. 了解到这是一套AIX+两节点10.2.0.4版本 ...

  6. mysql客户端hang_MySQL所有操作hang住了,怎么破?

    <MySQL所有操作hang住了,怎么破?>要点: 本文介绍了MySQL所有操作hang住了,怎么破?,希望对您有用.如果有疑问,可以联系我们. 作者介绍 王松磊,现任职于UCloud,从 ...

  7. mysql 解决慢sql_MySQL被慢sql hang住了,用shell脚本快速清除不断增长的慢sql的办法...

    某个初级dba误删index,mysql漫山遍野全是10S以上的慢sql,mysql服务被hang住了,而且慢sql不断在增加中,如果手动在mysql界面kill的话,根本来不及,这个时候,shell ...

  8. oracle删除表不等待,oracle故障处理之删除大表空间hang住

    背景 数据库分区表数据越来越大,需要对过期话的数据进行迁移,以及大的分区表需要进行数据的清理和删除,达到释放磁盘空间的目的. 问题说明 环境:linux 6.X 数据库:oracle 11.2.0.4 ...

  9. oracle关闭rs,Oracle 关闭(shutdown immediate)时hang住

    昨天晚上生产的两套10.2.0.4的数据库修改了参数,需要重启.在发出shutdown immediate命令后等了大概10分钟的时间,数据库还没有down下来.检查后台alert日志,发现从开始sh ...

最新文章

  1. linux nmon
  2. 2018蓝桥杯省赛java_蓝桥杯2018年A组省赛
  3. Qt文档阅读笔记-Qt工作笔记-QThread解析与实例(主线程发送信号给子线程)
  4. .NET字符串格式化的几种方法及@符号的使用
  5. MAgent安装及初步试验
  6. 1079. Total Sales of Supply Chain (25)-求数的层次和叶子节点
  7. kafkatemplate无法注入_SpringBoot 整合 Spring-Kafka 深度踩坑实战
  8. 软考信息系统项目管理师知识点总结2
  9. Hilbert变换简要剖析
  10. 计算机控制液压同步顶升系统,变频控制同步顶升液压系统
  11. 弦理论是如何解决量子力学和相对论间的矛盾
  12. Unity http协议连接封装简易版(已测试可用)
  13. 不定积分、定积分的区别与联系
  14. 整理最全的“大数据”学习资源
  15. android adb interface驱动安装
  16. Unity PIC 打包assetBundle报错
  17. discuz的htm模板代码分析
  18. 计算机题库一级第四,计算机一级题题库,第四章Excel
  19. Python-排序进阶(cmp_to_key)
  20. LeetCode 455[Python]. 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

热门文章

  1. 2023年南京航空航天大学英语笔译专业考研上岸前辈备考经验
  2. 视频加字幕怎么做?分享几种视频加字幕方法
  3. Android深入四大组件(七)Android8.0 根Activity启动过程(后篇)
  4. windows oracle重建监听,Windows下修改Oracle监听端口
  5. mysql手机版_Mysql管理安卓版下载-Mysql管理appv1.4 最新版-腾牛安卓网
  6. 实例变量和类变量、类方法和实例方法
  7. Labrika评测:AI工具做网站页面SEO内容优化
  8. 网络媒体十八种赢利模式
  9. 为撒电大计算机专业学籍出来的慢,2021年网络教育学籍什么情况下会被取消了...
  10. 考研数学学习思维导图