Lock wait timeout exceeded; try restarting transaction 怎么解决

1.在mysql的控制台 执行mysql> show full processlist; 查看当前库的线程情况;

2.再去查看innodb的事务表INNODB_TRX,看下里面是否有正在锁定的事务线程,看看trx_mysql_thread_id:9930577 是否在show full processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,我们需要手动kill掉。

mysql> SELECT * FROM information_schema.INNODB_TRX\G; 

3.看到有这条9930577的sql,kill掉,执行kill 9930577;

mysql> kill 9930577;

Query OK, 0 rows affected (0.00 sec)

然后再去查询INNODB_TRX表,就没有阻塞的事务sleep线程存在了,如下所示:

mysql> SELECT * FROM INNODB_TRX\G;

Empty set (0.00 sec)

ERROR:

No query specified

mysql>

再去执行update语句,就能正常执行了,如下所示:

mysql> update order_info  set province_id=15  ,city_id= 1667  where order_from=10 and order_out_sn='1407261241xxxx';

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0

mysql>

4,总结分析

表数据量也不大,按照普通的情况来说,简单的update应该不会造成阻塞的,mysql都是autocommit,不会出现update卡住的情况,去查看下autocommit的值。

mysql> select @@autocommit;

+--------------+

| @@autocommit |

+--------------+

|0|

+--------------+

1 row in set (0.00 sec)

mysql>

看到亮闪闪的0,这个设置导致原来的update语句如果没有commit的话,你再重新执行update语句,就会等待锁定,当等待时间过长的时候,就会报ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction的错误。

所以赶紧commit刚才执行的update语句,之后 set global autocommit=1;

原文章:http://blog.csdn.net/mchdba/article/details/38313881

你可能感兴趣的:(Lock wait timeout exceeded; try restarting transaction 怎么解决)