mysql大数据表删除操作锁表,导致其他线程等待锁超时(Lock wait timeout exceeded; try restarting transaction;)
背景:
1.有一个定时任务,每10分钟入一批统计数据;
2.另一个定时任务,每天定时清理7天前数据,此定时任务每天01:18:00执行;
现象:
每天01:20:00的统计数据入库失败,异常信息如下,其他时间点均无问题:
分析:
1.按异常信息显示,插入数据时,等待锁超时,mysql事务锁等待时间默认为50秒,出现此问题,说明向此表写入数据时,有其他线程将表锁住了。
2.每天只在01:20:00的统计时,等待锁超时,而其他时间点没有问题,怀疑与定时任务有关。
3.搜索代码,每天01:20:00左右执行,且对该表进行操作的。经查,发现只有每天01:18:00开始执行的定时任务,会对此表操作,具体操作语句为:
delete from table_name where statistics_time < ?
statistics_time字段有索引(非唯一索引),非主键字段,此操作会将表锁住,另外,此表数据量为800万,删除操作执行时间较长。
4.结论:经如上分析可知,delete from操作导致该表被锁住时间较长,入库时无法获取锁,超时。
修改方案:
1.分批次删除
2.为每次删除,设定时间间隔
具体步骤如下:
假设今天为2018-03-15日
1.数据保存天数为7天,删除数据的定时任务每天执行一次,正常情况下,不会有8天前的数据。但系统停止一段时间,重新运行时,可能会有8天前数据,以防万一,第一步先执行一条sql,删除8天前数据。
delete from table_name where statistics_time < '2018-03-07 00:00:00'
2.时间点加3个小时,再执行一次删除,然后休眠5秒,以此类推,每次加3小时进行8次,总计删除了24小时的数据。
为什么要休眠呢?
其实,最初的修改时并未加休眠操作,结果现象是,上一次删除操作刚刚释放掉锁,下一次删除又立即获取了锁,其他线程仍然等待锁超时。这个现象只在现网(现网数据库较为繁忙)发现,本地测试并没有发现,为确保没有问题,并且此删除操作并不要求很短时间内完成,所以每次删除后,加了5秒的休眠,以确保其他线程可以获取该表的锁。
delete from table_name where statistics_time < '2018-03-07 03:00:00'
Thread.sleep(5000);
经如上修改后,数据删除正常,其他对此表的修改操作也正常,问题解决。
另:
1.示例中是每3小时删除一次,若数据量过大,这个时间可以再缩短;
2.每次删除后休眠5秒,猜测可以再缩短休眠时间,可以自行尝试;
mysql大数据表删除操作锁表,导致其他线程等待锁超时(Lock wait timeout exceeded; try restarting transaction;)的更多相关文章
- Mysql事物锁等待超时(Lock wait timeout exceeded; try restarting transaction)
一.问题描述 在做查询语句时,MySQL 抛出了这样的异常:锁等待超时 Lock wait timeout exceeded; try restarting transaction,是当前事务在等待其 ...
- MySQL事务锁等待超时 Lock wait timeout exceeded; try restarting transaction
工作中处理定时任务分发消息时出现的问题,在查找并解决问题的时候,将相关的问题博客收集整理,在此记录下,以便之后再遇到相同的问题,方便查阅. 问题场景 问题出现的场景: 在消息队列处理消息时,同一事务内 ...
- 执行 update操作的时候有报错 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> show full processlist; #查看问题的线程!!!! 找到异常进程的ID 然后kill 掉: mysql> kill xxxxxxx; #xxxxxx是ID ...
- ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 表被锁的解决办法
转自:https://blog.csdn.net/mchdba/article/details/38313881 前言:朋友咨询我说执行简单的update语句失效,症状如下:mysql> upd ...
- Lock wait timeout exceeded; try restarting transaction(mysql事务锁)
现场环境客户要求删数据(界面没法直接操作),于是直接在数据库进行查询删除了,删完发现界面依然能查到删除后的数据,又用sql语句进行删除,发现报了错:Lock wait timeout exceeded ...
- mysql死锁,等待资源,事务锁,Lock wait timeout exceeded; try restarting transaction解决
前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处理: ...
- com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction 问题解决
有两种设置方法 第一种在mysql的配置文件中加入,然后重启mysql innodb_lock_wait_timeout = 500 第二种直接执行如下命令 set global innodb_loc ...
- com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
本文为博主原创: 以下为在程序运行过程中报的错误, org.springframework.dao.CannotAcquireLockException: ### Error updating dat ...
- 排查mysql innodb Lock wait timeout exceeded; try restarting transaction的问题
OMG写的时候崩溃了一次. 触发关注这个问题的事情是 我们在使用pt-online-schedule 改表的时候总是拿不到锁,并且报出mysql innodb Lock wait timeout ex ...
- mysql Lock wait timeout exceeded; try restarting transaction解决
前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处理: ...
随机推荐
- Selenium如何定位动态id/class的元素?
今天再给大家分享一个定位不到元素的原因——动态id. 没有打开新页面.没有alert.没有frame.加了等待时间,但是还是定位不到元素?很有可能是你要定位的元素的属性是动态的,即每次打开页面,这个 ...
- SVG素材整理(原)
why SVG? 1.矢量的国际图形标准,以后随着浏览器的发展,相信矢量会更多的出现 2.illustartor等多数矢量绘图软件可以导出为这种格式 so SVG现状 基本介绍:http:// ...
- svn ank问题
subvesion detected a working copy that need upgrade in 可以先在文件夹下cleapup,然后打开解决方案,在解决方案的右键选择upgrade wo ...
- 第08章-使用Spring Web Flow
使用Spring Web Flow Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程序.它将流程的定义与实现流程行为的类和视图分离开来. 1 在Spring中配置 ...
- MySQL性能调优与架构设计——第3章 MySQL存储引擎简介
第3章 MySQL存储引擎简介 3.1 MySQL 存储引擎概述 MyISAM存储引擎是MySQL默认的存储引擎,也是目前MySQL使用最为广泛的存储引擎之一.他的前身就是我们在MySQL发展历程中所 ...
- c++基本
要投身游戏业了,自学cocos2d-x之前准备把c++的基础再捡起来 基本语法 1. cout<<"hello world"; 2. 开头写 #include < ...
- [.net 多线程]异步编程模式
.NET中的异步编程 - EAP/APM 从.NET 4.5开始,支持的三种异步编程模式: 基于事件的异步编程设计模式 (EAP,Event-based Asynchronous Pattern) 异 ...
- IT学习资源
介绍个人微信公众平台:Web开发笔记 含有免费学习资源,个人学习笔记,技术文章分享 资源篇 1.webapp书城开发 链接: https://pan.baidu.com/s/1pMHGKrh 密码: ...
- 【leetcode 145. 二叉树的后序遍历】解题报告
前往二叉树的:前序,中序,后序 遍历算法 方法一:递归 vector<int> res; vector<int> postorderTraversal(TreeNode* ro ...
- Jenkins忘记密码
当Jenkins密码忘记时,可以去Jenkins的安装目录下的users\用户名_xxxxx\config.conf文件下找下找到<passwordHash></passwordHa ...