执行简单的update语句失效:报错

Lock wait timeout exceeded; try restarting transaction


解决办法:

1、 ps -ef | grep mysql 找到mysql安装路径

2、cd mysql路径-->进入bin,执行mysql -uroot -p进入命令行

3、查看数据库的隔离级别:

mysql> select @@tx_isolation;

+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

4,去查看先当前库的线程情况:

mysql> show full processlist;

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

| Id | User | Host | db | Command | Time | State | Info |

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

| 1 | event_scheduler | localhost | NULL | Daemon | 9635385 | Waiting on empty queue | NULL |

|9930577| business_web | 192.168.1.21:45503 | business_db | Sleep | 153 | | NULL |

| 9945825 | business_web | 192.168.1.25:49518 | business_db | Sleep | 43 | | NULL |

| 9946322 | business_web | 192.168.1.23:44721 | business_db | Sleep | 153 | | NULL |

| 9960167 | business_web | 192.168.3.28:2409 | business_db | Sleep | 93 | | NULL |

| 9964484 | business_web | 192.168.1.21:24280 | business_db | Sleep | 7 | | NULL |

| 9972499 | business_web | 192.168.3.28:35752 | business_db | Sleep | 13 | | NULL |

| 10000117 | business_web | 192.168.3.28:9149 | business_db | Sleep | 6 | | NULL |

| 10002523 | business_web | 192.168.3.29:42872 | business_db | Sleep | 6 | | NULL |

| 10007545 | business_web | 192.168.1.21:51379 | business_db | Sleep | 155 | | NULL |

没有看到正在执行的慢 SQL 记录线程,再去查看 innodb 的事务表 INNODB_TRX ,看下里面是否有正在锁定的事务线程,看看 ID 是否在 show full processlist 里面的 sleep 线程中,如果是,就证明这个 sleep 的线程事务一直没有 commit 或者 rollback 而是卡住了,我们需要手动 kill 掉。
5、 mysql> SELECT * FROM information_schema.INNODB_TRX\G;

*************************** 1. row ***************************

trx_id: 20866

trx_state: LOCK WAIT

trx_started: 2014-07-31 10:42:35

trx_requested_lock_id: 20866:617:3:3

trx_wait_started: 2014-07-30 10:42:35

trx_weight: 2

trx_mysql_thread_id:9930577

trx_query: delete from dltask where id=1

trx_operation_state: starting index read

trx_tables_in_use: 1

trx_tables_locked: 1

trx_lock_structs: 2

trx_lock_memory_bytes: 376

trx_rows_locked: 1

trx_rows_modified: 0

trx_concurrency_tickets: 0

trx_isolation_level: READ COMMITTED

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

6、看到有这条9930577的sqlkill掉,执行kill 9930577;

mysql> kill 9930577;

Query OK, 0 rows affected (0.00 sec)

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

mysql> SELECT * FROM INNODB_TRX\G;

Empty set (0.00 sec)

ERROR:

No query specified

8,总结分析
表数据量也不大,按照普通的情况来说,简单的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://www.linuxidc.com/Linux/2014-08/105078.htm

更多相关文章

  1. PHP获取MySQL执行sql语句的查询时间
  2. 删除2行1 Sql语句mysql
  3. 使用IN语句缓慢mysql删除查询
  4. 1.4.6 收集sql语句的执行计划 2
  5. 利用读写锁实现sqlite多线程写的问题
  6. 在SQL SELECT语句中重用别名字段
  7. sql语句中各子部分的执行顺序
  8. Oracle 尽量避免在SQL语句中使用 OR
  9. SQL Server调优系列进阶篇(查询语句运行几个指标值监测)

随机推荐

  1. Android关机充电流程
  2. android中空的view,可以设置为水平线
  3. Android 存储选项之 SQLite 优化那些事儿
  4. Android(安卓)fragment
  5. android设置透明背景
  6. ArcGis Android 10.2.6更新文档翻译
  7. Android面试系列文章2018之Android部分Fr
  8. Hello, Android 深入(一)
  9. Android知识梳理之BroadcastReceiver整理
  10. Android(安卓)base-adapter-helper 源码