已解决:Lock wait timeout exceeded; try restarting transaction死锁问题
报错信息
Lock wait timeout exceeded; try restarting transaction
超过锁定等待超时;尝试重新启动事务发生原因
流程不严谨问题导致SQL执行操作了全部数据,导致update语句执行时间过长导致死锁。
发生现象
死锁导致表被锁定,系统其他对这个表的RUD操作会被卡住,导致报错等一系列问题。
排查步骤
使用命令窗口或者Navicat 连接数据库后使用以下命令语句进行排查:
1、查看当前数据库所有的执行中的进程。
show processlist;
在结果列表里可以看到数据库下所有的进程,以及相关语句。
id:进程ID,如果需要结束某个进程可以直接kill 线程id,例如:kill 1。
user:当前用户,如果不是root,这个命令只会显示你权限范围内的sql语句。
host:显示这个语句是从哪个ip 的哪个端口上发出的。可用来追踪出问题语句的用户。
db:显示这个进程目前连接的是哪个数据库。
command:显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。
2、查看数据库中当前运行的所有事务
select * from information_schema.innodb_trx;
在结果列表中可以看到是否有表锁等待或者死锁,如果有死锁发生,可以通过一下命令来杀掉当前运行的事务。
kill 581; kill 后面的数字是 trx_mysql_thread_id 列的值。
自己解决这个问题的时候也是参考的这个结果列表,可以根据对应的SQL语句,以及trx_started:事务开始时间字段,开始时间字段可以看到是否已经开始很长一段时间。
根据对应的SQL语句进行分析优化或者杀掉对应的事务即可。
trx_id:事务ID。
trx_state:事务状态,有以下几种状态:RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING。
trx_started:事务开始时间。
trx_requested_lock_id:事务当前正在等待锁的标识,可以和 INNODB_LOCKS 表 JOIN 以得到更多详细信息。
trx_wait_started:事务开始等待的时间。
trx_weight:事务的权重。
trx_mysql_thread_id:事务线程 ID,可以和 PROCESSLIST 表 JOIN。
trx_query:事务正在执行的 SQL 语句。
trx_operation_state:事务当前操作状态。
trx_tables_in_use:当前事务执行的 SQL 中使用的表的个数。
trx_tables_locked:当前执行 SQL 的行锁数量。
trx_lock_structs:事务保留的锁数量。
trx_lock_memory_bytes:事务锁住的内存大小,单位为 BYTES。
trx_rows_locked:事务锁住的记录数。包含标记为 DELETED,并且已经保存到磁盘但对事务不可见的行。
trx_rows_modified:事务更改的行数。
trx_concurrency_tickets:事务并发票数。
trx_isolation_level:当前事务的隔离级别。
trx_unique_checks:是否打开唯一性检查的标识。
trx_foreign_key_checks:是否打开外键检查的标识。
trx_last_foreign_key_error:最后一次的外键错误信息。
trx_adaptive_hash_latched:自适应散列索引是否被当前事务锁住的标识。
trx_adaptive_hash_timeout:是否立刻放弃为自适应散列索引搜索 LATCH 的标识。
时间仓促,如有错误欢迎指出,欢迎在评论区讨论,如对您有帮助还请点个推荐、关注支持一下
作者:博客园 - 凉年技术
出处:http://www.cnblogs.com/xxhxs-21/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
若内容有侵犯您权益的地方,请公告栏处联系本人,本人定积极配合处理解决。