如何解决mysql的错误1205(hy000):锁等待超时超过;尝试重新启动事务`

nzrxty8p  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(392)

我似乎无法从mysql中提取任何有用的信息来帮助调试此错误: ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction . 你能帮我找一些吗?
繁殖:
一个过程是这样的:

start transaction;
update cfgNodes set name="foobar" where ID=29;

只是坐在那里(不承诺,不退缩)。很明显,这就是罪魁祸首——由于长时间运行的事务而占用锁的进程——我正试图找到的罪犯。
另一个进程尝试:

-- The next line just prevents you from having to wait 50 seconds
set innodb_lock_wait_timeout=1;

update cfgNodes set name="foobar" where ID=29;

第二个过程 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction (之后) innodb_lock_wait_timeout ,默认为50秒)
我怎么找到罪犯的信息?

hgb9j2n6

hgb9j2n61#

标准的推荐来源没有什么帮助: INFORMATION_SCHEMA.INNODB_TRX 显示交易,但没有太多关于它可以帮助我找到它。只有1个表被锁定(在这个伪小示例中),并且 trx_mysql_thread_id 是4093。

mysql> select * from INFORMATION_SCHEMA.INNODB_TRX\G

***************************1. row***************************

                    trx_id: 280907
                 trx_state: RUNNING
               trx_started: 2018-11-30 00:35:06
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 3
       trx_mysql_thread_id: 4093
                 trx_query: NULL
       trx_operation_state: NULL
         trx_tables_in_use: 0
         trx_tables_locked: 1
          trx_lock_structs: 2
     trx_lock_memory_bytes: 1136
           trx_rows_locked: 1
         trx_rows_modified: 1
   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: 0
          trx_is_read_only: 0
trx_autocommit_non_locking: 0
1 row in set (0.00 sec)
``` `INFORMATION_SCHEMA.INNODB_LOCKS` 是空的,这在文档中是有意义的,因为只有一个事务,当前没有人等待任何锁。也 `INNODB_LOCKS` 无论如何都不赞成。 `SHOW ENGINE INNODB STATUS` 是无用的: `cfgNodes` 一点也没提到 `SHOW FULL PROCESSLIST` 是空的,因为罪魁祸首现在没有实际运行查询。
但现在请记住 `trx_mysql_thread_id` 以前的?我们可以使用它来查看在该事务中执行的查询:

mysql> SELECT SQL_TEXT
-> FROM performance_schema.events_statements_history ESH,
-> performance_schema.threads T
-> WHERE ESH.THREAD_ID = T.THREAD_ID
-> AND ESH.SQL_TEXT IS NOT NULL
-> AND T.PROCESSLIST_ID = 4093
-> ORDER BY ESH.EVENT_ID LIMIT 10;
+-----------------------------------------------+
| SQL_TEXT |
+-----------------------------------------------+
| select @@version_comment limit 1 |
| start transaction |
| update cfgNodes set name="foobar" where ID=29 |
+-----------------------------------------------+
3 rows in set (0.00 sec)

瞧-我们现在看到的历史上的最后10个查询,为每个剩余的交易,让我们找到罪魁祸首。

相关问题