mysql:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

运行sql到一半时计算机进入睡眠状态,打开后停止pycharm重新运行,出现如下错误:

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

参考:https://blog.csdn.net/qq_32447301/article/details/78688032?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-3&spm=1001.2101.3001.4242

解决了问题。

  • 终端打开mysql后,查看数据库的隔离级别, 为重复读
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
  • 查看线程情况:
mysql> show full processlist;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2324
Current database: *** NONE ***

+------+------+------------------+------+---------+------+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------省略n行+n行的sql语句
| 2324 | root | localhost        | NULL | Query   |    0 | init     | show full processlist     
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6 rows in set (0.08 sec)
  • 显示了正在执行的慢SQL记录线程,尝试kill2324,提示:
mysql> kill 2324
    -> ;
ERROR 1317 (70100): Query execution was interrupted

大概就是说我之前做的查询被中断了

  • 查看innodb的事务表INNODB_TRX,看下里面是否有正在锁定的事务线程,看看ID是否在show full processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,我们需要手动kill掉。
mysql> SELECT * FROM information_schema.INNODB_TRX\G;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2325
Current database: *** NONE ***

*************************** 1. row ***************************
                    trx_id: 47450
                 trx_state: RUNNING
               trx_started: 2020-08-07 12:25:19
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 345173
       trx_mysql_thread_id: 2320
                 trx_query: update goods set goods.name_acronym = case when goods.id = 1 then 'putao' when goods.id = 2 then 'hamigua' when goods.id = 3 then 'mangguo' when goods.id = 4 then 'mangguo' when goods.id = 5 then 'mangguo' when goods.id = 6 then 'xiangjiao' when goods.id = 7 then 'mugua' when goods.id = 8 then 'taozi' when goods.id = 9 then 'taozi' when goods.id = 10 then 'xiahei' when goods.id = 11 then 'liulian' when goods.id = 12 then 'shanzhu' when goods.id = 13 then 'aijicheng' when goods.id = 14 then 'jinkouhongxiyou' when goods.id = 15 then 'aogan' when goods.id = 16 then 'longyan' when goods.id = 17 then 'sanliulian' when goods.id = 18 then 'lanmei' when goods.id = 19 then 'jinkouhongti' when goods.id = 20 then 'jinkouwuzihongti' when goods.id = 21 then 'xingziliyanyun' when goods.id = 22 then 'xiaobaixing' when goods.id = 23 then 'xiaheili' when goods.id = 24 then 'jiangbo' when goods.id = 25 then 'putao' when goods.id = 26 then 'ceshi' when goods.id = 27 then 'youtao' when goods.id = 28 then 'xiahei' when goods.id =
       trx_operation_state: NULL
         trx_tables_in_use: 1
         trx_tables_locked: 1
          trx_lock_structs: 3973
     trx_lock_memory_bytes: 390696
           trx_rows_locked: 345171
         trx_rows_modified: 341200
   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: 10000
          trx_is_read_only: 0
trx_autocommit_non_locking: 0
1 row in set (0.02 sec)

ERROR: 
No query specified

  • kill掉trx_mysql_thread_id:2320
mysql> kill 2320;
Query OK, 0 rows affected (0.00 sec)
  • 再去查询INNODB_TRX表,就没有阻塞的事务sleep线程存在了
mysql> SELECT * FROM information_schema.INNODB_TRX\G;
Empty set (0.00 sec)

ERROR: 
No query specified
  • 再次查看线程情况
mysql> show full processlist;
+------+------+------------------+------+---------+------+-------+-----------------------+
| Id   | User | Host             | db   | Command | Time | State | Info                  |
+------+------+------------------+------+---------+------+-------+-----------------------+
| 2316 | root | 172.20.0.1:36104 | ??   | Sleep   |   47 |       | NULL                  |
| 2317 | root | 172.20.0.1:36108 | ??   | Sleep   |   47 |       | NULL                  |
| 2318 | root | 172.20.0.1:36112 | ??   | Sleep   |   47 |       | NULL                  |
| 2319 | root | 172.20.0.1:36116 | ??   | Sleep   |   47 |       | NULL                  |
| 2325 | root | localhost        | NULL | Query   |    0 | init  | show full processlist |
+------+------+------------------+------+---------+------+-------+-----------------------+
5 rows in set (0.00 sec)
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transactionMySQL数据库中的一个错误,表示事务等待锁的时间超过了设定的超时时间。这个错误通常发生在并发访问数据库时,多个事务同时请求相同资源导致的。 解决这个问题的方法有以下几种: 1. 增加超时时间:可以通过修改MySQL配置文件中的innodb_lock_wait_timeout参数来增加超时时间。该参数表示事务等待锁的时间,单位为秒。可以将其设置为一个较大的值,例如设置为60或120。 2. 优化查询语句:可以通过优化查询语句来减少事务等待锁的时间。可以使用合适的索引、避免全表扫描、减少不必要的锁定等方式来优化查询语句。 3. 提交或回滚事务:如果一个事务长时间占用了某个资源,可以考虑提交或回滚该事务,释放资源给其他事务使用。 4. 检查死锁:如果多个事务之间存在死锁,可以使用SHOW ENGINE INNODB STATUS命令来查看当前的死锁情况,并根据情况进行处理。 5. 调整并发控制策略:可以根据实际情况调整并发控制策略,例如使用乐观锁或悲观锁来控制并发访问。 6. 增加硬件资源:如果数据库服务器的硬件资源不足,可以考虑增加硬件资源,例如增加CPU、内存或磁盘空间等。 这些方法可以根据具体情况选择使用,通常可以解决ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值