MySQL事务锁问题-Lock wait timeout exceeded

一、问题现象

接口响应时间超长,耗时几十秒才返回错误提示,后台日志中出现Lock wait timeout exceeded; try restarting transaction的错误。

二、问题场景

  1. 在同一事务内先后对同一条数据进行插入和更新操作;
  2. 多台服务器操作同一数据库;
  3. 瞬时出现高并发现象;

三、问题原因

  1. 在高并发的情况下,Spring事务造成数据库死锁,后续操作超时抛出异常。
  2. MySQL数据库采用InnoDB模式,默认参数innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。

四、解决方法

  1. 查看数据库当前的进程,看一下有无正在执行的慢SQL记录线程。

mysql> show processlist;

  1. 查看当前的事务

当前运行的所有事务:
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掉。

  1. 批量删除事务表中的事务

这里用的方法是:通过information_schema.processlist表中的连接信息生成需要处理掉的MySQL连接的语句临时文件,然后执行临时文件中生成的指令。

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; 就是空了。

这时候系统就正常了

五、故障排查

  1. mysql都是autocommit配置mysql> select @@autocommit;
    ±-------------+
    | @@autocommit |
    ±-------------+
    | 0 |
    ±-------------+
    1 row in set (0.00 sec)

##如果是0 ,则改为1

mysql> set global autocommit=1;

  1. mysql的引擎检查,可以检查一下数据库引擎是不是InnoDB(mysql5.5.5以前默认是MyISAM,mysql5.5.5以后默认是InnoDB)
    show ENGINES;

查看表使用的存储引擎:show table status from dbName where name='tableName';

修改表的存储引擎:alter table tableName engine=innodb;

查看用户锁表和对表解锁的 sql 语句

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值