接口响应时间超长,耗时几十秒才返回错误提示,后台日志中出现Lock wait timeout exceeded; try restarting transaction
的错误mysql
一、在同一事务内前后对同一条数据进行插入和更新操做;
二、多台服务器操做同一数据库;
三、瞬时出现高并发现象;sql
一、在高并发的状况下,Spring事物形成数据库死锁,后续操做超时抛出异常。
二、Mysql数据库采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错数据库
一、查看数据库当前的进程,看一下有无正在执行的慢SQL记录线程。segmentfault
mysql> show processlist;
二、查看当前的事务
当前运行的全部事务服务器
mysql> SELECT * FROM information_schema.INNODB_TRX;
当前出现的锁并发
mysql> SELECT * FROM information_schema.INNODB_LOCKs;
锁等待的对应关系高并发
mysql> SELECT * FROM information_schema.INNODB_LOCK_waits;
解释:看事务表INNODB_TRX,里面是否有正在锁定的事务线程,看看ID是否在show processlist里面的sleep线程中,若是是,就证实这个sleep的线程事务一直没有commit或者rollback而是卡住了,咱们须要手动kill掉。学习
搜索的结果是在事务表发现了不少任务,这时候最好都kill掉。区块链
三、批量删除事务表中的事务
我这里用的方法是:经过information_schema.processlist表中的链接信息生成须要处理掉的MySQL链接的语句临时文件,而后执行临时文件中生成的指令。spa
mysql> select concat('KILL ',id,';') from information_schema.processlist where user='cms_bokong'; +------------------------+ | concat('KILL ',id,';') | +------------------------+ | KILL 10508; | | KILL 10521; | | KILL 10297; | +------------------------+ 18 rows in set (0.00 sec)
固然结果不可能只有3个,这里我只是举例子。参考连接上是建议导出到一个文本,而后执行文本。而我是直接copy到记事本处理掉 ‘|’,粘贴到命令行执行了。均可以。
kill掉之后再执行SELECT * FROM information_schema.INNODB_TRX; 就是空了。
这时候系统就正常了
3.一、mysql都是autocommit配置
mysql> select @@autocommit; +--------------+ | @@autocommit | +--------------+ | 0 | +--------------+ 1 row in set (0.00 sec) # 若是是0 ,则改成1 mysql> set global autocommit=1;
3.二、mysql的引擎检查,能够检查一下数据库引擎是否是InnoDB(mysql5.5.5之前默认是MyISAM,mysql5.5.5之后默认是InnoDB)
show ENGINES; #检查命令 若是不是的话改成 InnoDB :
show table status from db_name where name='table_name';
alter table table_name engine=innodb;