MySQL应用报错:java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
开发反馈,某业务系统插入一条记录的时候,日志报错,插入失败:
### Error updating database. Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: INSERT INTO ...
登录mysql,使用show processlist查看没有发现相关会话的存在。然后使用show engine innodb status也没有最近的死锁信息。
至此,可以猜测,因为变量innodb_lock_wait_timeout的缘故,插入失败的会话已经结束。
以下是变量innodb_lock_wait_timeout的用途说明:
innodb事务等待行锁的时间,单位是秒,等待超过这个时间后就会放弃。默认是50秒。尝试访问被另一个InnoDB事务锁定的行的事务在发出以下错误之前最多要等待这么多秒才能对该行进行写访问:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
发生锁等待超时时,将回滚当前语句(而不是整个事务)。要使整个事务回滚,请使用--innodb-rollback-on-timeout选项启动服务器。另请参见第14.21.4节“ InnoDB错误处理”。对于高度交互式应用程序或OLTP系统你可能需要降低该参数的值,给用户反馈或者将更新到队列中供以后处理。可以为长时间运行的后端操作(例如,数据仓库中等待其他大型插入或更新操作完成的转换步骤)增加此值。
innodb_lock_wait_timeout仅适用于InnoDB行锁。MySQL表锁不会在InnoDB内部发生,并且此超时不适用于等待表锁。
锁等待超时值不适用于死锁,因为InnoDB会立即检测到它们并回滚其中一个死锁的事务。请参见第14.7.5.2节“死锁检测和回滚”。
innodb_lock_wait_timeout可以用SET GLOBAL或SET SESSION语句运行时设置。更改GLOBAL设置需要足够的特权来设置全局系统变量(请参见第5.1.8.1节“系统变量特权”),并影响随后连接的所有客户端的操作。任何客户端都可以更改innodb_lock_wait_timeout的SESSION设置,这仅影响该客户端。
顺便查看了一下数据库中其它事务:
>SELECT * FROM information_schema.INNODB_TRX\G
*************************** 1. row ***************************
trx_id: 5877143864
trx_state: RUNNING
trx_started: 2019-11-02 16:43:24
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 0
trx_mysql_thread_id: 10010454
trx_query: NULL
trx_operation_state: NULL
trx_tables_in_use: 0
trx_tables_locked: 0
trx_lock_structs: 0
trx_lock_memory_bytes: 360
trx_rows_locked: 0
trx_rows_modified: 0
trx_concurrency_tickets: 0
trx_isolation_level: REPEATABLE READ
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 9996
trx_is_read_only: 0
trx_autocommit_non_locking: 0
这里看到,事务5877143864状态是running,但是trx_query却为null。光从这里看不到执行的sql,也不知道具体在哪个对象上加了锁。
通过show engine innodb status也只是能看到该事务,但是看不到该事务的详细信息。
这里需要明白的是,如果一个会话(连接)里面有未提交事务,然后不做任何操作,那么这个线程处于Sleep状态。这也是为何通过show processlist查看,对应的线程也是处于sleep状态的原因。
通过以下查询,看看该会话最后执行的sql是什么内容:
SELECT
a.sql_text,
c.id,
d.trx_started
FROM
PERFORMANCE_SCHEMA.events_statements_current a
JOIN PERFORMANCE_SCHEMA.threads b ON a.thread_id = b.thread_id
JOIN information_schema.PROCESSLIST c ON b.processlist_id = c.id
JOIN information_schema.innodb_trx d ON c.id = d.trx_mysql_thread_id
WHERE
c.id = 10010454
ORDER BY
d.trx_started\G;
查出的结果语句也是一个插入语句,与报错的语句居然是相同功能的语句。那就正好可以分析一下,上面应用为何报错了。
原因其实也很简单,就是该会话执行插入后,事务没有及时提交。导致后续的插入在插入唯一键时候阻塞了(这里涉及到跟开发沟通才了解的业务逻辑,本身设计存在问题以及唯一键问题)。
MySQL应用报错:java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction的更多相关文章
- java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction问题 1.问题描述 执行了几条update语句 ...
- java.sql.SQLException: Lock wait timeout exceeded --转
org.springframework.dao.CannotAcquireLockException 的解决> 直接上 bug 的详细信息: 2012-03-12 15:20:31 XmlBea ...
- Spring_错误 java.sql.SQLException: Lock wait timeout exceeded | CannotAcquireLockException 的解决
java.sql.SQLException: Lock wait timeout exceeded | org.springframework.dao.CannotAcquireLockExcept ...
- 执行 update操作的时候有报错 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> show full processlist; #查看问题的线程!!!! 找到异常进程的ID 然后kill 掉: mysql> kill xxxxxxx; #xxxxxx是ID ...
- 项目中遇到的死锁问题: Lock wait timeout exceeded; try restarting transaction
最近项目中频繁出现 Lock wait timeout exceeded; try restarting transaction这个错误,把我们弄得痛苦不堪啊,为了解决问题,上网上找好多资料,终于把 ...
- Caused by: java.sql.BatchUpdateException: Transaction error, need to rollback. errno:1205 Lock wait timeout exceeded; try restarting transaction
更新的时候报 Caused by: java.sql.BatchUpdateException: Transaction error, need to rollback. errno:1205 Loc ...
- 【mybatis】mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wait timeout exceeded; try restarting transaction
今天使用mybatis和jpa的过程中,发现这样一个问题: mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wai ...
- mysql死锁,等待资源,事务锁,Lock wait timeout exceeded; try restarting transaction解决
前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处理: ...
- 排查mysql innodb Lock wait timeout exceeded; try restarting transaction的问题
OMG写的时候崩溃了一次. 触发关注这个问题的事情是 我们在使用pt-online-schedule 改表的时候总是拿不到锁,并且报出mysql innodb Lock wait timeout ex ...
随机推荐
- Redis特点分析及性能优化
一.Key >Redis key值是二进制安全的,这意味着可以可以使用任何二进制序列作为key值.空字符串也是有效的key值. >key取值原则 1.键值不需要太长,消耗内存,且在数据中查 ...
- RabbitMQ基本概念(一)-RabbitMQ的优劣势及产生背景
本篇并没有直接讲到技术,例如没有先写个Helloword.我想在选择了解或者学习一门技术之前先要明白为什么要现在这个技术而不是其他的,以免到最后发现自己学错了.同时如果已经确定就是他,最好先要了解下技 ...
- VS code key shortcuts for windows
mac上的快捷键,尽量是选择像我用vs studio上靠近. ctrl+K+S: 显示快捷键列 ctrl+shift+p: 系统配置命令行 ctrl+p:项目中文件列表,选择文件 Alt+M:当前文件 ...
- JS 基本操作
1.判断数据是否包含某些数据 var ary=[{age:20,name:"a"},{age:20,name:"b"},,{age:30,name:" ...
- Python的Mixin
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826299.html 一:Mixin模式 Mixin编程是一种开发模式,是一种 将多个不同类中的功能单元的 ...
- 《linux就该这么学》课堂笔记06 编写shell脚本、if、for
1.1.脚本的两种方式 交互式(Interactive):用户每输入一条命令就立即执行. 批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令. 1. ...
- Unexpected EOF in archive 或者 rmtlseek not stopped at a record boundary
多半都是文件在传输.复制的时候,发生了损坏: 尽量cp不要用mv 其次,注意文件的大小:
- PyCharm专业版激活(2018年Windows版)
友情提示: 本教程仅供学习交流使用,如需商业用途,强烈建议使用官方正式版.(官网正式链接为:https://www.jetbrains.com/pycharm/) 当然网上有很多其他激活教程,我看到的 ...
- 洛谷P2495 [SDOI2011]消耗战(虚树dp)
P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...
- 火鸡堂 对 基于云的胜利冲锋队 为了交项目干杯 的 Beta 产品测试报告
基于云的胜利冲锋队 第一次上手 第一次上手体验感觉如何?能否正常运行? 不错,学生端和老师端各功能很清晰,大部分功能正常运行,但添加班级之类的部分功能页面暂时无响应 看到千帆竞发图泪流满面,图表中有各 ...