文章目录

  • 一、场景模拟
  • 二、紧急处理
  • 三、原因分析
  • 四、相关命令
    • 1、查看正在执行的事务
    • 2、查看正在锁的事务
    • 3、查看等待锁的事务
    • 4、查看所有的线程列表
    • 5、定位未提交的事务执行的sql语句

公司的一哥们在使用事务时未进行commit,链接断开后数据库执行了回滚操作,导致线上直播相关库的部分数据丢失,本文通过mysql命令行模拟该事故,并提供解决该问题的思路。希望对大家有帮助。

一、场景模拟

通过命令行模拟两个数据库链接,同时开启事务,操作同一行数据。
在数据库链接1开启事务之后,执行rollback之前,数据库链接2开启事务并执行更新操作。

  • 原始数据
id name pinyin description
22193 跽棺反侧 ji’guan’fan’ce !!!形容人多拥挤~~~111
  • 数据库链接1

  • 数据库链接2

实际执行中,数据库链接2在执行update操作时会卡住,排队等待数据库链接1释放操作完成。
在数据库链接1执行rollback操作后,数据库连接2执行commit操作,此时查看数据,会发现数据库中的数据并未更新成功,即数据库链接2的数据丢失。

二、紧急处理

如果线上碰到该问题,首先把出问题的线程kill掉,防止影响更多的正常功能,然后再根据mysql的binlog对受影响的数据进行恢复。

具体使用到的命令在第四部分。

三、原因分析

  • 事务过程中执行其他非数据库操作,导致事务长期未被处理。
  • 事务处理异常或实现逻辑有误,导致事务未被正常处理。
  • 网络,数据库负荷过大等。

四、相关命令

1、查看正在执行的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

上图可以查看到正在进行的事务(未进行commit)操作的线程信息,线程id为122985;

2、查看正在锁的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

3、查看等待锁的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

4、查看所有的线程列表

show full processlist;

结合第一步查到的线程id,可以确定该事务涉及到的表名和数据库链接信息。

确认出现问题的sql在该线程id时,及时使用下面语句kill掉线程,防止影响更多的数据。

kill 122985;

5、定位未提交的事务执行的sql语句

通过以上步骤并不能直观的定位到出问题的sql语句,此时我们可以通过开启通用日志的方式,定位具体的sql语句。

# 查看general log配置
show variables like '%general_log%'# 开启general log
SET GLOBAL general_log = 1;

通用日志会记录所有sql信息,数据量很大,建议只在排查错误时开启,线上关闭。

此时根据找到进程号时间戳找到对应的记录,定位具体的sql。

参考链接:
https://blog.csdn.net/flysnownet/article/details/114837550
https://www.cnblogs.com/kerrycode/p/11013479.html
https://blog.csdn.net/emoers/article/details/77971468
https://cloud.tencent.com/developer/article/1511089

mysql事务未提交 也未回滚相关推荐

  1. MySQL事务 - 自增ID的回滚以及Auto Increment在InnoDB的实现

    自增ID未回滚 首先做一个测试 CREATE TABLE auto_inc_test( id int auto_increment, test_id int, primary key id(id))E ...

  2. 事务的提交commit、回滚rollback

    1.事务 事物由一个或多个sql语句组成,如果其中一个语句不能完成,整个单元就会回滚,所有影响到的数据将返回到事物开始以前的状态.因而,只有事物中的所有语句都成功执行,才能说明这个事物被成功的执行. ...

  3. mysql设置不主动提交无效_关闭事务自动提交无效,回滚也无效

    我是通过看数据库里面数据确认的.代码比较类似,就这么多 #!/usr/bin/python from MySQLdb import connect conn = connect(db="te ...

  4. Java-JDBC【之】事务介绍、事务特性、操作事务(事务提交、异常回滚)

    Java-JDBC[之]事务介绍.事务特性.操作事务(事务提交.异常回滚) 1.数据库事务 1.1.介绍 1.2.事务特性(ACID) 1.3.隔离性(Isolation),带来的问题与处理 1.4. ...

  5. MySQL 中的重做日志,回滚日志以及二进制日志的简单总结

    转载自 MySQL 中的重做日志,回滚日志以及二进制日志的简单总结 MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志 ...

  6. java事务什么时候回滚_spring事务什么时候会自动回滚

    在java中异常的基类为Throwable,他有两个子类xception与Errors.同时RuntimeException就是Exception的子类,只有RuntimeException才会进行回 ...

  7. git撤消所有未提交或未保存的更改

    本文翻译自:git undo all uncommitted or unsaved changes I'm trying to undo all changes since my last commi ...

  8. 0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚

    0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚 参考文章: (1)0046 @Transactional注解的几个参数--事务传播控制--事务隔离级 ...

  9. mysql事务的提交和回滚

    START TRANSACTION | BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND ...

最新文章

  1. 【Cmake】Cmake学习记录
  2. 计算机系统覆盖,计算机系统软件顶会OSDI 2021最佳论文出炉,邢波团队研究入选...
  3. Linux-Ubuntu 启用root账户
  4. geoda权重矩阵导入matlab,空间计量经济学-分析解析.ppt
  5. 一、Arcgis api js -- 基本概念
  6. Android近场通信---NFC基础(三)
  7. MySQL索引的Index method中btree和hash的优缺点
  8. 从 MySQL 5.6 升级到 MySQL 8.0,Facebook 付出了什么代价?
  9. java读取资源文件(Properties)
  10. 推荐一个学习内核的博客
  11. CentOS 7完全卸载MySQL
  12. Matlab中的画图函数
  13. 进出口流程 报关单据
  14. 云知声开源全栈语音交互方案
  15. itx机箱尺寸_鞋盒大小的ITX机箱初体验 | FORMULA X1装机展示
  16. python 网易云音乐评论爬取3
  17. 华为硬件工程师手册_华为,英飞凌,中兴硬件工程师面试题
  18. MP4/MOV/3GP文件的“ftyp”(转)
  19. C#WinForm实现对Excel的数据处理
  20. 12位符号数转归一化float的实现

热门文章

  1. 《Linux Shell编程学习笔记之一》
  2. golang context的done和cancel的理解 for循环channel实现context.Done()阻塞输出
  3. Python Bytes和String相互转换,解决Bytes转换String时b‘xxx‘问题
  4. Eclipse在包下新建子包
  5. MySQL的month()函数方法对应得Oracle方法
  6. 传递爱心 汇聚真情—宕昌县特殊教育学校公益行动
  7. DirectShow 工作流程
  8. javascript数组对象去重
  9. QGC4.1.2二次开发(1)--Qt5.12.6 andorid开发环境搭建
  10. input赋值时的空格问题