代码之家  ›  专栏  ›  技术社区  ›  Peter V. Mørch

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

  •  0
  • Peter V. Mørch  · 技术社区  · 6 年前

    我似乎无法从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;
    

    第二个过程是 innodb_lock_wait_timeout

    我如何找到罪犯的任何信息?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Peter V. Mørch    6 年前

    标准推荐来源几乎没有帮助:

    INFORMATION_SCHEMA.INNODB_TRX 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 是空的,考虑到 documentation ,因为只有一个事务,当前没有人等待任何锁。阿尔索 INNODB_LOCKS

    SHOW ENGINE INNODB STATUS 没有用: cfgNodes 一点也没有提到

    SHOW FULL PROCESSLIST 是空的,因为罪魁祸首现在没有实际运行查询。

    trx\u mysql\u线程\u 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次查询的历史记录,这让我们能够找到罪魁祸首。