前言:
此刻同学们对“mysql表被锁了怎么办”大体比较关切,你们都需要学习一些“mysql表被锁了怎么办”的相关内容。那么小编同时在网摘上收集了一些有关“mysql表被锁了怎么办””的相关知识,希望朋友们能喜欢,咱们快快来了解一下吧!先上图,现场排查问题找到的错误信息
Lock wait timeout exceeded;
基本原因:后提交的事务等待前面处理的事务释放锁,但是在等待的时候超过了mysql的锁等待时间,就会引发这个异常。
Mysql造成锁的情况有很多,下面我们就列举一些情况:
执行DML操作没有commit,再执行删除操作就会锁表。在同一事务内先后对同一条数据进行插入和更新操作。表示索引设计不当,导致数据库出现死锁。长事物,阻塞DDL,继而阻塞所有同表的后续操作。磁盘空间满 造成
本环境问题出现情况:
1、在同一事务内先后对同一条数据进行插入和更新操作;
2、多台服务器操作同一数据库;
3、瞬时出现高并发现象;
原因分析:
在高并发的情况下,Spring事物造成数据库死锁,后续操作超时抛出异常。
Mysql数据库采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。
就目前由于现场没有远程可操作,没有太有效的排查手段,只能进入苦逼的扫代码优化代码的方式减少mysql操作量来处理该问题。待后续找到具体的问题后再来补充。延迟超时时间的方式不可取,只是延缓了死亡时间,不能真正解决问题。
参考信息
1、锁等待超时。是当前事务在等待其它事务释放锁资源造成的。可以找出锁资源竞争的表和语句,优化SQL,创建索引等。如果还是不行,可以适当减少并发线程数。
2、事务在等待给某个表加锁时超时,估计是表正被另的进程锁住一直没有释放。
可以用 SHOW INNODB STATUS/G; 看一下锁的情况。
标签: #mysql表被锁了怎么办