mysql事务未提交 也未回滚
文章目录
- 一、场景模拟
- 二、紧急处理
- 三、原因分析
- 四、相关命令
- 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事务未提交 也未回滚相关推荐
- MySQL事务 - 自增ID的回滚以及Auto Increment在InnoDB的实现
自增ID未回滚 首先做一个测试 CREATE TABLE auto_inc_test( id int auto_increment, test_id int, primary key id(id))E ...
- 事务的提交commit、回滚rollback
1.事务 事物由一个或多个sql语句组成,如果其中一个语句不能完成,整个单元就会回滚,所有影响到的数据将返回到事物开始以前的状态.因而,只有事物中的所有语句都成功执行,才能说明这个事物被成功的执行. ...
- mysql设置不主动提交无效_关闭事务自动提交无效,回滚也无效
我是通过看数据库里面数据确认的.代码比较类似,就这么多 #!/usr/bin/python from MySQLdb import connect conn = connect(db="te ...
- Java-JDBC【之】事务介绍、事务特性、操作事务(事务提交、异常回滚)
Java-JDBC[之]事务介绍.事务特性.操作事务(事务提交.异常回滚) 1.数据库事务 1.1.介绍 1.2.事务特性(ACID) 1.3.隔离性(Isolation),带来的问题与处理 1.4. ...
- MySQL 中的重做日志,回滚日志以及二进制日志的简单总结
转载自 MySQL 中的重做日志,回滚日志以及二进制日志的简单总结 MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志 ...
- java事务什么时候回滚_spring事务什么时候会自动回滚
在java中异常的基类为Throwable,他有两个子类xception与Errors.同时RuntimeException就是Exception的子类,只有RuntimeException才会进行回 ...
- git撤消所有未提交或未保存的更改
本文翻译自:git undo all uncommitted or unsaved changes I'm trying to undo all changes since my last commi ...
- 0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚
0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚 参考文章: (1)0046 @Transactional注解的几个参数--事务传播控制--事务隔离级 ...
- mysql事务的提交和回滚
START TRANSACTION | BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND ...
最新文章
- 【Cmake】Cmake学习记录
- 计算机系统覆盖,计算机系统软件顶会OSDI 2021最佳论文出炉,邢波团队研究入选...
- Linux-Ubuntu 启用root账户
- geoda权重矩阵导入matlab,空间计量经济学-分析解析.ppt
- 一、Arcgis api js -- 基本概念
- Android近场通信---NFC基础(三)
- MySQL索引的Index method中btree和hash的优缺点
- 从 MySQL 5.6 升级到 MySQL 8.0,Facebook 付出了什么代价?
- java读取资源文件(Properties)
- 推荐一个学习内核的博客
- CentOS 7完全卸载MySQL
- Matlab中的画图函数
- 进出口流程 报关单据
- 云知声开源全栈语音交互方案
- itx机箱尺寸_鞋盒大小的ITX机箱初体验 | FORMULA X1装机展示
- python 网易云音乐评论爬取3
- 华为硬件工程师手册_华为,英飞凌,中兴硬件工程师面试题
- MP4/MOV/3GP文件的“ftyp”(转)
- C#WinForm实现对Excel的数据处理
- 12位符号数转归一化float的实现
热门文章
- 《Linux Shell编程学习笔记之一》
- golang context的done和cancel的理解 for循环channel实现context.Done()阻塞输出
- Python Bytes和String相互转换,解决Bytes转换String时b‘xxx‘问题
- Eclipse在包下新建子包
- MySQL的month()函数方法对应得Oracle方法
- 传递爱心 汇聚真情—宕昌县特殊教育学校公益行动
- DirectShow 工作流程
- javascript数组对象去重
- QGC4.1.2二次开发(1)--Qt5.12.6 andorid开发环境搭建
- input赋值时的空格问题