• java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction


    java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction问题

    1.问题描述

      执行了几条update语句之后的,再执行其他的update语句,后台就报如下错误:

    <-- java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
        at com.trs.components.wcm.publish.element.PublishContentDocumentImpl.setPublishTimeAndURL(PublishContentDocumentImpl.java:851)
        at com.trs.components.common.publish.domain.publisher.PageGenerator.updateContentPublishTime(PageGenerator.java:236)
        at com.trs.components.common.publish.domain.publisher.PageGenerator.generateDetail(PageGenerator.java:216)
        at com.trs.components.common.publish.domain.taskdispatch.PageTaskWorker.executeTask(PageTaskWorker.java:278)
        at com.trs.components.common.publish.domain.taskdispatch.PageTaskWorker.run(PageTaskWorker.java:153)
        at com.trs.components.common.publish.domain.taskdispatch.ThreadPool$Worker.run(ThreadPool.java:56)

    2.问题分析:

      2.1 锁等待超时。是当前事务在等待其它事务释放锁资源造成的。可以找出锁资源竞争的表和语句,优化你的SQL,创建索引等,如果还是不行,可以适当减少并发线程数。
      2.2 你的事务在等待给某个表加锁时超时了,估计是表正被另的进程锁住一直没有释放。可以用 SHOW INNODB STATUS/G; 看一下锁的情况。

    3.问题解决

      在使用mysql运行某些语句时,会因数据量太大而导致死锁,没有反映。这个时候,就需要kill掉某个正在消耗资源的query语句即可, KILL命令的语法格式如下:

      KILL [CONNECTION | QUERY] thread_id

      每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止一个线程。

      KILL允许自选的CONNECTION或QUERY修改符:KILL CONNECTION与不含修改符的KILL一样:它会终止与给定的thread_id有关的连接。KILL QUERY会终止连接当前正在执行的语句,但是会保持连接的原状。

      如果您拥有PROCESS权限,则您可以查看所有线程。如果您拥有超级管理员权限,您可以终止所有线程和语句。否则,您只能查看和终止您自己的线程和语句。您也可以使用mysqladmin processlist和mysqladmin kill命令来检查和终止线程。

      首先登录mysql,然后使用: show processlist; 查看当前mysql中各个线程状态。

    mysql> show processlist; 
    +---------+------+-------------------+--------------------+---------+-------+-------+------------------+
    | Id      | User | Host              | db                 | Command | Time  | State | Info             |
    +---------+------+-------------------+--------------------+---------+-------+-------+------------------+
    | 3205081 | root | 172.19.2.8:50317  | ********           | Sleep   | 16485 |       | NULL             |
    | 3205088 | root | 172.19.2.8:50321  | ********           | Sleep   |  8170 |       | NULL             |
    | 3205099 | root | 172.19.2.8:50324  | ********           | Sleep   |  6123 |       | NULL             |
    | 3205128 | root | 172.19.2.8:50330  | ********           | Sleep   | 16254 |       | NULL             |
    | 3205172 | root | 172.19.2.8:50354  | ********           | Sleep   |  2723 |       | NULL             |
    | 3205296 | root | 172.19.2.8:50396  | ********           | Sleep   |  3804 |       | NULL             |
    | 3210074 | root | 172.19.2.8:50842  | ********           | Sleep   |  2582 |       | NULL             |
    | 3210353 | root | 172.19.2.8:51064  | information_schema | Sleep   |  3516 |       | NULL             |
    | 3210354 | root | 172.19.2.8:51066  | information_schema | Sleep   |  3569 |       | NULL             |
    | 3210630 | root | 172.19.2.12:61845 | ********           | Query   |     0 | init  | show processlist |
    +---------+------+-------------------+--------------------+---------+-------+-------+------------------+
    10 rows in set (0.00 sec)

      以上显示出当前正在执行的sql语句列表,找到消耗资源最大的那条语句对应的id.

      然后运行kill命令,命令格式如下:

    mysql> kill 3205081;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> kill 3205088;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> kill 3205099;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> kill 3205128;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> kill 3205172 ;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> kill 3205296;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> kill 3210074;
    Query OK, 0 rows affected (0.00 sec)

      杀掉即可。

  • 相关阅读:
    Pie(二分)
    Prime Ring Problem + nyoj 素数环 + Oil Deposits + Red and Black
    关于各种排列(dfs)
    精讲N皇后问题
    (转)女生应该找一个玩ACM的男生
    Radar Installation(贪心,可以转化为今年暑假不ac类型)
    vector之妙用系列
    寻找最大数(贪心)
    Linux使用tcpdump命令抓包并使用wireshark分析
    使用MSF发现主机和端口扫描
  • 原文地址:https://www.cnblogs.com/zs-notes/p/9076694.html
Copyright © 2020-2023  润新知