美文网首页
Lock wait timeout exceeded; try

Lock wait timeout exceeded; try

作者: 青春弥留际 | 来源:发表于2017-08-17 10:16 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/ychwrxtx.html