mysql数据库插入无反应问题

情景再现:
页面点击插入数据操作无反应
问题追溯:
查看日志,sql执行语句输出,sql语句无错,报异常Lock wait timeout exceeded; try restarting transaction
解决问题:
直接数据库执行sql语句,长时间无反应,其他数据行插入成功,外键索引列为特定值时插入不成功,判断该处有锁未释放
1:查看当前的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
发现有一个事物处于运行中状态,trx_mysql_thread_id 进程id为567843

2:查看当前锁定的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
无事物被锁

3:查看当前等锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
无事物等待锁

查出死锁进程:SHOW PROCESSLIST
进程id为567843的进程运行时长Time50000多秒,一直在运行

杀掉进程 KILL 567843;
该事物结束。重新运行,成功插入

总结:
程序运行到插入数据的函数时,开启了事物,执行了sql,本来应该commit事物的,由于未知原因未提交,导致事物因为一直在等待提交命令而阻塞。当前事物锁定了外键值一直未释放,导致后续该外键值得数据因为一直等待锁释放而执行超时。
项目设置的事物超时时间是默认的-1.如果执行长时间dql事物可设置过期时间,超时会自动回滚
Spring事务超时 = 事务开始时到最后一个Statement创建时时间 + 最后一个Statement的执行时超时时间(即其queryTimeout)。
即事物开始到sql执行结束的时间,sql执行后即使阻塞也不会触发事物的超时自动回滚

posted @ 2020-08-22 14:33  马又虫  阅读(1623)  评论(0编辑  收藏  举报