MySQL:MySQLTransactionRollbackException - Lock wait timeout exceeded; try restarting transaction

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

“Lock wait timeout exceeded; try restarting transaction” 一般出现这样的错误时,往往是因为一些事务在等待获取某个锁,但由于这个锁被其他长时间未完成的事务持有,所以导致等待超时。

一 , 定位问题

可以通过以下几种命令去定位

  • SHOW FULL PROCESSLIST;显示当前MySQL中的所有进程信息,包括每个进程的ID、用户、主机、数据库、命令、运行时间等。如果你看到有某个进程的运行时间特别长,或者状态一直处于"Locked",那么就有可能是这个进程导致了锁等待超时。
    eg: 881611 root xxxx:60646 xxx Query 2046 starting xxxx xxxx

  • SHOW ENGINE INNODB STATUS;:显示InnoDB存储引擎的详细状态信息,包括当前的事务、锁情况、缓冲池状态、磁盘I/O信息等。然后通过一下两部分定位。

    • LATEST DETECTED DEADLOCK会显示最新检测到的死锁信息,
    • TRANSACTIONS"部分会显示当前 InnoDB 引擎中的事务状态,包括事务的 ID,状态,所持有的锁,以及正在等待的锁等信息。
  • SHOW OPEN TABLES;:显示当前打开的表的信息,了解哪些表可能正在被锁定。

  • SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;:显示当前的InnoDB锁情况。可以直观地查看锁的状态,需要InnoDB引擎支持。

二 , 解决方案

紧急措施

1.紧急措施:终止(KILL)相关的线程,释放任何被该线程持有的锁

eg: 以上面的例子为列 KILL 881611
需要注意,可能会对业务产生影响,导致数据状态不一致或者业务逻辑中断 !!!

2.次之紧急措施:调整 Innodb 锁等待时间,延缓了问题的出现

注意 这只是允许线程等待更长的时间来获取锁,而不是解决了锁的竞争问题。还是会导致其他线程仍然在等待获取锁 !!!

  • 临时调整 优先推荐
    • SET GLOBAL innodb_lock_wait_timeout = 120;立即生效,但是在 MySQL 服务器重启之后就会失效。
  • 永久调整
    • MySQL 的配置文件通常是 my.cnf 或 my.ini,位于 MySQL 服务器的安装目录下。在 [mysqld] 部分添加或修改以下行:
      [mysqld]
      innodb_lock_wait_timeout = 120
      

非紧急措施

  1. 优化查询:优化导致问题的查询语句,例如通过添加索引来提高查询性能,或者改变查询的逻辑以避免需要获取锁。
  2. 修改数据库的并发控制策略:例如,你可以考虑使用乐观锁(如果应用逻辑允许)。
  3. 设置合理的连接数:如果有太多的连接在等待获取锁,那么你可能需要减少最大连接数,以减少锁争用的可能性。
    1. 查看当前的连接数 SHOW STATUS LIKE 'Threads_connected';
    2. 设置最大连接数 SET GLOBAL max_connections = 200;
  4. 开启并优化慢查询日志
    1. 确认慢查询日志是否已经开启 SHOW VARIABLES LIKE 'slow_query_log';
    2. 开启慢查询日志 SET GLOBAL slow_query_log = 'ON';
    3. 查看慢查询的时间阈值 SHOW VARIABLES LIKE 'long_query_time';
    4. 查看慢查询日志的文件位置SHOW VARIABLES LIKE 'slow_query_log_file';
  5. 调整事务的大小和复杂性
    1. 更小、更简单的事务会导致更少的锁争用。

mysqltransactionrollbackexception,mysql,数据库,服务器文章来源地址https://www.toymoban.com/news/detail-595079.html

到了这里,关于MySQL:MySQLTransactionRollbackException - 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日
    浏览(49)
  • 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日
    浏览(35)
  • wait_timeout and interactive_timeout 参数

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

    2024年02月08日
    浏览(39)
  • 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日
    浏览(50)
  • 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日
    浏览(43)
  • Springboot启动出现Waiting for changelog lock...问题

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

    2024年04月12日
    浏览(33)
  • 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日
    浏览(46)
  • 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日
    浏览(48)
  • Flutter报错:Waiting for another flutter command to release the startup lock

    翻译:等待另一个flutter命令释放启动锁,也就是上一个 flutter 命令还未结束,又执行了另外一个 flutter 命令,或者刚启动项目时,项目还没有加载完毕,执行了一个 flutter 命令。 解决方法: 1、关闭vscode 2、打开flutter sdk按路径找到  bin/cache/lockfile 3、删除lockfile文件 若删除

    2024年02月16日
    浏览(61)
  • Kafka中的fetch-min-size、fetch-max-wait和request.timeout.ms配置

    当前kafka的版本为2.8.11,Spring Boot的版本为2.7.6,在pom.xml中引入下述依赖:  然后在yml配置文件进行如下配置: 1、fetch-min-size fetch-min-size表示消费者一次拉取请求中,服务器应该返回的最小数据量,单位是字节,默认值为1个字节。如果服务器没有足够的数据返回,请求会等待

    2024年02月02日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包