mysql Lock wait timeout exceeded; try restarting transaction

这篇具有很好参考价值的文章主要介绍了mysql Lock wait timeout exceeded; try restarting transaction。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、mysql死锁及超时的原因

当在业务逻辑中看到这个错误,或者mysql中使用update语句更新数据报错: Lock wait timeout exceeded; try restarting transaction。也就是遇到了mysql死锁,等待资源,事务锁的问题。

可能原因:意外处理没有关闭连接,导致连接过多、或是要更新的表的锁在其它线程手里、系统异常导致事务未提交,再次请求相同记录等等。

InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置(默认50s),判断是否需要进行timeout的操作:

mysql Lock wait timeout exceeded; try restarting transaction,《数据库问题解决方案》系列,mysql,数据库,sql

二、mysql死锁排查思路

1、show full processlist 查询当前数据库全部线程

show full processlist 查询当前数据库全部线程
show engine innodb status命令查看当前的数据库请求,然后再判断当前事务中锁的情况
select * from information_schema.innodb_trx 查询当前运行的全部事务

注:select * from information_schema.innodb_trx;
MySQL 5.5版本以上才可以用此方法,5.5版本以下会没有这个表;[Err] 1109 - Unknown table ‘innodb_trx’ in information_schema
当中trx_mysql_thread_id为事务线程的id,參照show full processlist命令中的线程信息查看

如果数据库中有锁的话,LOCK WAIT的就是锁等待的

mysql Lock wait timeout exceeded; try restarting transaction,《数据库问题解决方案》系列,mysql,数据库,sql
此时你可以直接使用命令:kill 事务线程id 杀掉它。比如:kill 99999

没有的话,找到Command 状态是query 并且Time 时间很长的id)有时候一定程度上也能解决一定的问题。

再用 show full processlist 查询当前数据库全部线程,发现刚才的线程没了。

但是一般这样还是很难发现被锁的行记录问题所在

2、information_schema

information_schema这张数据表保存了MySQL服务器所有数据库的信息。

我们可以用这三张表innodb_trx、innodb_locks、innodb_lock_waits,使用如下命令,简单地监控当前的事务并分析可能存在的问题:

 select * from information_schema.innodb_trx ( 当前运行的所有事务)

 select * from information_schema.innodb_locks (当前出现的锁)

 select * from information_schema.innodb_lock_waits (锁等待的对应关系)

注意:在8.0.13版本中
innodb_locks表由performance_schema.data_locks表所代替,
innodb_lock_waits表则由performance_schema.data_lock_waits表代替。

三张表具体信息:

mysql Lock wait timeout exceeded; try restarting transaction,《数据库问题解决方案》系列,mysql,数据库,sql

mysql Lock wait timeout exceeded; try restarting transaction,《数据库问题解决方案》系列,mysql,数据库,sql
mysql Lock wait timeout exceeded; try restarting transaction,《数据库问题解决方案》系列,mysql,数据库,sql
其中比较常用的一些列:

  • trx_id:InnoDB存储引擎内部唯一的事物ID
  • trx_status:当前事务的状态
  • trx_status:事务的开始时间
  • trx_requested_lock_id:等待事务的锁ID
  • trx_wait_started:事务等待的开始时间
  • trx_weight:事务的权重,反应一个事务修改和锁定的行数,当发现死锁需要回滚时,权重越小的值被回滚
  • trx_mysql_thread_id:MySQL中的进程ID,与show processlist中的ID值相对应
  • trx_query:事务运行的SQL语句

综上大体可以清楚的找到等待的事务即没有获取锁的事务,进一步调整业务逻辑代码。

一些建议:
1、可以结合update语句,调整索引,让update能唯一定位到数据行,尽量退化到行锁粒度;
2、相关查询语句增加索引,减少事物整体耗时;
3、避免长事物、可以降低@Transactional的粒度;
4、减少批处理数据量,规范业务逻辑流程,考虑异常事务回滚等问题;文章来源地址https://www.toymoban.com/news/detail-584649.html

到了这里,关于mysql Lock wait timeout exceeded; try restarting transaction的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于Minio性能优化 A timeout exceeded while waiting to proceed with the request, please reduce your request

    具体报错:A timeout exceeded while waiting to proceed with the request, please reduce your request 经查阅资料,有4种解决方案 查阅文献: https://www.oomake.com/question/17229356 https://www.nuomiphp.com/t/6254af8578e87f77ee3d038c.html https://www.hxstrive.com/subject/minio/673.htm https://github.com/minio/minio/tree/master/docs/config#ap

    2024年02月16日
    浏览(38)
  • mysql 设置wait_timeout连接等待时间

    扩展阅读wait_timeout 是mysql在关闭一个非交互的连接之前所要等待的秒数,其取值范围为1-2147483(Windows),1-31536000(linux),默认值28800。 1. 查询当前mysql连接等待时间(wait_timeout) 如果前期没有设置wait_timeout的时间默认时间28800 2. 在数据库配置文件内加上wait_timeout设置 mysql 5以上的

    2024年02月11日
    浏览(28)
  • wait_timeout and interactive_timeout 参数

    非交互模式连接:通常情况下,应用到RDS实例会采用非交互模式,具体采用哪个模式需要查看应用的连接方式配置,比如PHP通过传递MYSQL_CLIENT_INTERACTIVE常量给mysql_connect()函数即可开启连接的交互模式。wait_timeout参数控制非交互模式连接的超时时间(单位秒,默认值为24小时即

    2024年02月08日
    浏览(27)
  • http请求报错context deadline exceeded (Client.Timeout exceeded while awaiting headers)

    context deadline exceeded (Client.Timeout exceeded while awaiting headers) 当你遇到该问题时可能你已经调试很久了仍然没有实际解决,一起来看看是否对你有帮助。 原因: 目标地址不可达、网络不通导致; 出现此情况,可以看看ping www.baidu.com是否正常: 如正常则可能是自身问题,如不正常

    2024年02月11日
    浏览(36)
  • ssh 启动失败,状态报:activing(start),timeout exceeding

    某次权限配置过程中,突然出现ssh断开,后查,ssh无法重启,状态异常,报超时断开,现场环境8.2版本: 1)检查日志报错如下: 2)前一天晚上,ssh无论怎样都无法正常,启动也显示是/usr/sbin/sshd -D [listener] 0 of 10-100 startups,状态始终显示超时,有意思的是,第2天查看的时候

    2024年02月16日
    浏览(31)
  • ARL资产灯塔系统搭建关于docker的restarting问题和timeout of 12000ms解决办法

    一、arl worker和arl scheduler显示restarting问题 在通过docker搭建资产灯塔系统时,一步步按照教程搭建后,在通过命令docker-compose up -d启动容器后,再接着docker-compose ps命令查看,发现arl worker和arl scheduler显示一直restarting。查看日志报错,此时需要在该文件docker-compose.yml下添加RISK

    2024年02月04日
    浏览(54)
  • Springboot启动出现Waiting for changelog lock...问题

    今天在开发的时候,Springboot启动的时候出现Waiting for changelog lock…问题. 问题原因 :该问题就是发生了数据库的死锁问题,可能是由于一个杀死的liquibase进程没有释放它对DATABASECHANGELOGLOCK表的锁定,导致服务启动失败,解决办法如下: 解决方案 :我们先用如下的sql语句查询

    2024年04月12日
    浏览(27)
  • org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool

    Java HttpUtil 出现错误: org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool         最近项目中大量调用http请求,线上出现了 ConnectionPoolTimeoutException  这个问题,但是本地服务器一直没能复现出来,但是定位问题应该是之前调用http的工具类封装的有问

    2024年02月13日
    浏览(38)
  • docker进入容器时报错 Error response from daemon: Container xxx is restarting, wait until the container is

    使用docker run命令运行容器,再进入容器时报错 运行容器命令 docker run --restart=always --name mongo -v /data/mongo:/data/db -p 27017:27017 -d mongo --auth 进入容器命令 docker exec -it mongo bash Error response from daemon: Container 90831dd80b32a1502d9535c874ceec899b5fd70c883481195b4f36cd29be47b0 is restarting, wait until the cont

    2024年02月11日
    浏览(43)
  • Linux——解决问题:waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by pr

    在Linux操作系统下使用命令sudo apt install安装包时报错:waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 2715 (unattended-upgr)… 173s 出现该问题,是因为另一个进程正在使用 apt 命令,导致无法获取锁来执行的命令。可以结束在使用apt命令的进程后再安装。结

    2024年02月03日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包