背景:

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;)的更多相关文章

  1. Mysql事物锁等待超时(Lock wait timeout exceeded; try restarting transaction)

    一.问题描述 在做查询语句时,MySQL 抛出了这样的异常:锁等待超时 Lock wait timeout exceeded; try restarting transaction,是当前事务在等待其 ...

  2. MySQL事务锁等待超时 Lock wait timeout exceeded; try restarting transaction

    工作中处理定时任务分发消息时出现的问题,在查找并解决问题的时候,将相关的问题博客收集整理,在此记录下,以便之后再遇到相同的问题,方便查阅. 问题场景 问题出现的场景: 在消息队列处理消息时,同一事务内 ...

  3. 执行 update操作的时候有报错 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

    mysql> show full processlist; #查看问题的线程!!!! 找到异常进程的ID 然后kill 掉: mysql> kill xxxxxxx; #xxxxxx是ID ...

  4. ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 表被锁的解决办法

    转自:https://blog.csdn.net/mchdba/article/details/38313881 前言:朋友咨询我说执行简单的update语句失效,症状如下:mysql> upd ...

  5. Lock wait timeout exceeded; try restarting transaction(mysql事务锁)

    现场环境客户要求删数据(界面没法直接操作),于是直接在数据库进行查询删除了,删完发现界面依然能查到删除后的数据,又用sql语句进行删除,发现报了错:Lock wait timeout exceeded ...

  6. mysql死锁,等待资源,事务锁,Lock wait timeout exceeded; try restarting transaction解决

    前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处理: ...

  7. com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction 问题解决

    有两种设置方法 第一种在mysql的配置文件中加入,然后重启mysql innodb_lock_wait_timeout = 500 第二种直接执行如下命令 set global innodb_loc ...

  8. com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

    本文为博主原创: 以下为在程序运行过程中报的错误, org.springframework.dao.CannotAcquireLockException: ### Error updating dat ...

  9. 排查mysql innodb Lock wait timeout exceeded; try restarting transaction的问题

    OMG写的时候崩溃了一次. 触发关注这个问题的事情是 我们在使用pt-online-schedule 改表的时候总是拿不到锁,并且报出mysql innodb Lock wait timeout ex ...

  10. mysql Lock wait timeout exceeded; try restarting transaction解决

    前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处理: ...

随机推荐

  1. Hadoop深入学习:MapTask详解

    转自:http://flyingdutchman.iteye.com/blog/1878775#bc2337280 Hadoop深入学习:MapTask详解 博客分类: Hadoop MapTask执 ...

  2. 如何快速搭建基于python+appium的自动化测试环境

    首先申明本文是基本于Python与Android来快速搭建Appium自动化测试环境: 主要分为以下几个步骤: 前提条件: 1)安装与配置python环境,打开 Python官网,找到“Downloa ...

  3. LIS问题---HDU1025 Constructing Roads In JGShining's Kingdom

    发现这个说的比较通俗: 假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5.下面一步一步试着找出它.我们定义一个序列B,然后令 i = 1 to 9 ...

  4. XE中FMX操作ListBox,添加上千条记录(含图片)

    我之前是想在ListBox的每个Item上添加一个图片,Item上所有的内容都是放在Object里赋值,结果发现加载一百条记录耗时四五秒: procedure TMainForm.AddItem; v ...

  5. 百度图片API

    转载请注明出处:http://blog.csdn.net/yuanwofei/article/details/16343743 一.通用api http://image.baidu.com/i?tn= ...

  6. Canvas保存为图片

    public static void GenerateCanvas(string imgSaveName, int canvasWidth, int canvasHeight, string imgD ...

  7. XXX培训机构Python自动化教程目录

  8. NSArray 数组

    前言 数组只能存储 OC 对象,不能存储 C 语言中的基本数据类型,也不能存储 nil . Xcode 7 对系统中常用的一系列容器类型都增加了泛型支持(),有了泛型后就可以指定容器类中对象的类型了. ...

  9. 关于spring xml文件中的xmlns,xsi:schemaLocation

    链接:https://blog.csdn.net/u010571844/article/details/50767151 使用spring也有一段时间了,配置文件也见了不少了,但是发现配置文件的bea ...

  10. IIS发布ASP程序问题汇总

    看异常位置,因为域的问题