1.在mysql的控制臺 執(zhí)行mysql> show full processlist; 查看當(dāng)前庫的線程情況;
2.再去查看innodb的事務(wù)表INNODB_TRX杠氢,看下里面是否有正在鎖定的事務(wù)線程站刑,看看trx_mysql_thread_id:9930577?是否在show full processlist里面的sleep線程中,如果是鼻百,就證明這個sleep的線程事務(wù)一直沒有commit或者rollback而是卡住了绞旅,我們需要手動kill掉。
mysql> SELECT * FROM information_schema.INNODB_TRX\G;?
3.看到有這條9930577的sql温艇,kill掉因悲,執(zhí)行kill 9930577;
mysql> kill 9930577;
Query OK, 0 rows affected (0.00 sec)
然后再去查詢INNODB_TRX表,就沒有阻塞的事務(wù)sleep線程存在了勺爱,如下所示:
mysql> SELECT * FROM INNODB_TRX\G;
Empty set (0.00 sec)
ERROR:
No query specified
mysql>
再去執(zhí)行update語句晃琳,就能正常執(zhí)行了,如下所示:
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琐鲁,總結(jié)分析
表數(shù)據(jù)量也不大卫旱,按照普通的情況來說,簡單的update應(yīng)該不會造成阻塞的围段,mysql都是autocommit顾翼,不會出現(xiàn)update卡住的情況,去查看下autocommit的值奈泪。
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|0|
+--------------+
1 row in set (0.00 sec)
mysql>
看到亮閃閃的0适贸,這個設(shè)置導(dǎo)致原來的update語句如果沒有commit的話,你再重新執(zhí)行update語句段磨,就會等待鎖定取逾,當(dāng)?shù)却龝r間過長的時候,就會報ERROR?1205?(HY000):?Lock?wait?timeout?exceeded;?try?restarting?transaction的錯誤苹支。
所以趕緊commit剛才執(zhí)行的update語句砾隅,之后 set global?autocommit=1;
原文章:http://blog.csdn.net/mchdba/article/details/38313881