Lock wait timeout exceeded; try restarting transaction的错误

MySQL批量新增或修改时出现异常: Lock wait timeout exceededtry restarting transaction 在使用MySQL数据库进行批量新增或修改操作时,有时候会遇到"nested exception is java.sql.SQLException: Lock wait timeout exceeded;try restarting transaction"异常。本文将介绍异常出现的原因,并提供解决该异常的方法。 阅读详情

一、异常发现
        在进行接口调用时,响应时间超长,之后接口返回异常,查看日志发现为Lock wait timeout exceeded; try restarting transaction的错误。     

 二、异常定位
        因为使用的数据库为mysql,而InnoDB表类型会出现锁等待的情况,在出现锁等待时,会根据参数innodb_lock_wait_timeout(默认50s)的配置,判断是否需要进行timeout的操作,如果等待时间超过了设置的时间就会报错。

1、锁表语句确认
        可以在information_schema查询数据库使用情况,information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问等等信息都保存在information_schema表里面。

        我们可以用下面三张表来查原因: 

1、 innodb_trx ## 当前运行的所有事务 
 2、innodb_locks ## 当前出现的锁 
 3、innodb_lock_waits ## 锁等待的对应关系

        如果数据库中有锁的话,查看 innodb_trx就可以看到对应的信息。通过查询知道是哪条语句锁了,图中红色语句为占用系统资源的语句,我们需要杀掉这个锁,执行 kill 线程id号。上面这条记录的id为319618246 ,所以我们执行:kill 319618246即可。

SELECT * FROM information_schema.INNODB_TRX

以下为执行前后对比:

2、实际场景排查
        按照经验列举锁等待超时出现的情况:

1、在同一事务内先后对同一条数据进行插入和更新操作

2、多台服务器操作同一数据库

3、瞬时出现高并发现象,spring事务造成数据库死锁,后续操作超时抛出异常

4、事务A对记录C进行更新/删除操作的请求未commit时,事务B也对记录C进行更新/删除操作。此时,B会等A提交事务,释放行锁。当等待时间超过innodb_lock_wait_timeout设置值时,会产生“LOCK WAIT”事务。

5、数据库内存不足,导致无法执行写操作。

         本次问题是因为update语句导致的锁表,因为是在疲劳测试(压测12小时)过程中出现的问题,使用10并发进行压测,每秒差不多15笔申请调用,所以上述的1234都不符合,查看发现mysql资源不足,内存达到100%,确认实际异常原因。

 三、解决思路
1、本次解决方式
        删除无用数据。并使用下边的方法2。

2、其他场景解决思路扩展             
       1、【治标方法】innodb_lock_wait_timeout 锁定等待时间改大
        修改超时时间将 #innodb_lock_wait_timeout = 50 修改为 innodb_lock_wait_timeout = 500。

        缺点:全局更改,影响也是全局的,等待时间加长,容易使等待事务增多导致堆积问题。

        2、【治标方法】事务信息查询
        通过SELECT * FROM information_schema.innodb_trx查询未提交事务,查到一个一直没有提交的只读事务(trx_state=”LOCK WAIT”),找到对应线程,执行:kill 线程ID。线程id为表中的trx_mysql_thread_id字段。

        3、【治标方法】如果杀掉线程依然不能解决,可以查找执行线程耗时比较久的任务,kill掉
        执行

SELECT * from information_schema.`PROCESSLIST` WHERE Time > 1000 AND USER = 'xxx' ORDER BY TIME desc;

找到线程:kill 线程ID。

        4、【根本解决方法!】找到锁表的事务,分析锁表原因,进行优化
        根据实际业务进行解决,举例(网上找的):司机APP进行运单签收,需要对et_waybill_info表某些记录进行更新操作。一直处于锁等待状态,直到超时报错。经排查发现:系统定时器定时执行任务,将所有未标识亮的已装车或签收的运单,按批次处理,如果运单装车了但长时间未上传GPS、温湿度等信息,会一直被定时器处理。数据量越积越大,队列长时间等待,对et_waybill_info表锁住没有释放,致使签收要操作et_waybill_info表无法拿到锁,进行数据操作。

        临时解决方案:停掉定时器任务。       

        根本解决方案:优化定时器。

MySQL 报错 “Lock wait timeout exceeded”:3 步定位原因,1 分钟解决 MySQL锁等待超时问题分析与解决方案 摘要:本文针对MySQL常见的"Lock wait timeout exceeded"错误,提出了一套快速定位和解决方案。首先解析了锁等待超时的本质原因,即并发事务对同一资源的竞争导致。随后提供了3步精准定位锁源的方法:通过系统表查询等待事务、查找持有锁的事务、分析事务详情。针对紧急情况,给出了两种快速解决方案:通知提交事务或强制终止连接。最后提出长期优化策略,包括缩短事务执行时间、调整超时参数和优化索引设计,从根源上减少锁竞争问题。整套方案兼顾快 阅读详情

相关推荐

【异常解决】MySQL数据库Lock wait timeout exceededtry restarting transaction问题解析及解决方案

因为使用的数据库为 MySQL,而 member_level_record 表的引擎是 InnoDB 表类型,此时会出现锁等待的情况,在出现锁等待时,会根据参数 innodb_lock_wait_timeout(默认50s)的配置,判断是否需要进行 timeout 的操作,如果等待时间超过了设置的时间就会报错。也就是说,这台 MySQL 服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问等等信息都保存在 information_schema 库里面。

DreamDlee的博客 2226

Lock wait timeout exceededtry restarting transaction

MySQL出现"Lock wait timeout exceeded"错误通常由锁竞争或磁盘满载引起。针对锁竞争问题,可通过查询INNODB_TRX表定位阻塞事务并Kill持有锁的线程;若是磁盘满载导致,需检查binlog文件占用情况,删除历史文件并设置自动过期(expire_logs_days)。处理过程中需注意:不要删除最新的binlog文件(避免主从复制中断),若误删导致启动失败可修正索引文件或重置binlog。最后需清理残留的PID文件确保MySQL正常重启。建议长期优化SQL和

tomcat_zhu的博客 295

Mysql出现“ Lock wait timeout exceeded; try restarting transaction错误

今天用django写一个小程序,结果调用数据库d

赵小文wencie的专栏 4万+

Lock wait timeout exceededtry restarting transaction问题解析

目录 一、异常发现 二、异常定位 1、锁表语句确认 2、实际场景排查 三、解决思路 1、本次解决方式 2、其他场景解决思路扩展 1、【治标方法】innodb_lock_wait_timeout锁定等待时间改大 2、【治标方法】事务信息查询 3、【治标方法】如果杀掉线程依然不能解决,可以查找执行线程耗时比较久的任务,kill掉 4、【根本解决方法!】找到锁表的事务,分析锁表原因,进行优化 一、...

zcm036200的博客 13万+

关于MySQL的lock wait timeout exceeded解决方案

关于MySQL出现lock wait timeout exceeded; try restarting transaction 的解决方案。 一、问题抛出 在做查询语句时,MySQL 抛出了这样的异常: MySQL server error report:Array ( [0] => Array ( ...

weixin_34166472的博客 1万+

MySQL错误Lock wait timeout exceeded,try restarting transaction

http://account.forenose.com/column/content/427100648.html

k12104的专栏 3807

解决MySQL “Lock wait timeout exceededtry restarting transaction错误

Lock wait timeout exceeded” 是一个常见的MySQL错误,指示了潜在的性能问题或死锁。适当的监控和维护可以帮助预防此类问题,确保数据库的健康和性能。在处理时,务必谨慎,避免采取可能破坏数据完整性的行动。

一勺菠萝丶的博客 5726

MySQL出现错误1205-Lock wait timeout exceeded; try restarting transaction

今天在清空mysql数据库中的表格数据时,报了如下错误,导致操作失败: 上网查找了一下,了解到了该类问题出现的主要原因是:Mysql的 InnoDB存储引擎是支持事务的,事务开启后没有被主动Commit,导致该资源被长期占用,其他事务在抢占该资源时,因上一个事务的锁而导致抢占失败!因此出现 Lock wait timeout exceeded。 解决办法:     方法一: 1.

当下 3万+

MySql 报Lock wait timeout exceededtry restarting transaction错误,解决

一. 问题抛出 在做查询语句时,MySQL 抛出了这样的异常: MySQL server error report:Array ( [0] => Array ( [message] => MySQL Query Error ) [1] => Array ( [sql] => SELECT * FROM taobao_trade WHERE order_status = 1

无痕的博客 1712

mysql Lock wait timeout exceeded; try restarting transaction 错误解决

最近运行的项目中,出现 'Lock wait timeout exceeded; try restarting transaction' 报错,导致出现一系列问题。 一直运行的很平稳,突然出现这问题,比较难判断哪里出了问题。 先上网搜索,参考: 关于MySQL的lock wait timeout exceeded解决方案 https://segmentfault.com/a/11900...

beyond__devil的博客 938

Lock wait timeout exceededtry restarting transaction解决

Lock wait timeout exceededtry restarting transaction解决

u011250186的博客 1万+

数据库报1205-Lock wait timeout exceededtry restarting transaction解决方案

MySQL错误码1205代表了一个死锁错误(Deadlock)。死锁是多个事务相互等待彼此释放锁资源的情况,导致它们都无法继续执行。这通常发生在并发访问数据库时,多个事务试图同时修改相同的数据行或资源。

境里婆娑 1万+

Lock wait timeout exceeded; try restarting transaction

锁等待超时 Lock wait timeout exceeded; try restarting transaction,是当前事务在等待其它事务释放锁资源造成的 ### Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction ; SQL []; Lock wait timeout...

悟世君子的博客 4万+

Lock wait timeout exceededtry restarting transaction的解决方案

一、 背景介绍 前段时间遇到一个锁超时的问题,错误日志如下: 出现这个问题的背景是:在全表同步的时候,为了提高效率,关闭了自动提交。 statementDelete = conn.prepareStatement(deleteSql.toString()); conn.setAutoCommit(false); 在业务逻辑处理完毕之后,没有手动提交,导致事物(在数据库代码中就是thread)一直处于running的状态。 在下一个任务要用到这个表时,发现之前的事物没哟提交,就会一直等待,然后

xhuiting的博客 5046
上一篇: nacos自动更新导致druird属性数据更新异常
下一篇: MySQL——DDL、DML、DQL、DCL语法总结
爱思考的People
博客等级 码龄16年 278粉丝 · 50原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值