龙空技术网

工作内容-数据库篇-Mysql被锁

听闻所见 449

前言:

此刻同学们对“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表被锁了怎么办