问题:
前台发起提交,一直在等待
想到SQL业务逻辑异常复杂,去到数据库执行那条SQL,提示如下
Procedure execution failed
1205 - Lock wait timeout exceeded; try restarting transaction
可见是表被锁了
解决:
#当前出现的锁
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS
并没有锁!
-- 锁等待的对应关系
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS
也没有等着锁的任务
#当前运行的所有事务,
SELECT * FROM information_schema.INNODB_TRX
可以发现有一个事务一直在执行,框起来的是执行的SQL语句,临时解决办法,为杀掉锁。
kill 910; #910为trx_mysql_thread_id的值
永久解决办法是,优化框起来的SQL,本例中的SQL业务逻辑及其复杂,并且在一条SQL中通知执行了查询和修改操作,导致SQL一直卡着。本例采取的优化方式是用存储过程代替那条巨无霸SQL。