Lock wait timeout exceeded; try restarting transaction

Lock wait timeout exceeded; try restarting transaction

1.前言

今天线上环境日志,突然出现一个错误:Lock wait timeout exceeded; try restarting transaction)。凭经验可以推断,这是有某个事务直接时间太长没有提交,导致其他事务等待超时了。那么具体怎么排查呢?

今天我在做一个关于事务的小测试。

表结构:

CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test` VALUES ('1', '1');
INSERT INTO `test` VALUES ('2', '1');

然后我在一个窗口中执行:

第一个窗口:

BEGIN;
 UPDATE test SET age =2 where id =1;

第二个窗口:

BEGIN;
 UPDATE test SET age =3 where id =1;
COMMIT;

然后先执行第一个窗口,再执行第二个窗口

看到第二个窗口会一直阻塞等待,最后抛出异常:

Lock wait timeout exceeded; try restarting transaction

2.原因探查

我们可以通过到information_schema 中来进行查找。

  • innodb_trx 当前运行的所有事务
  • innodb_locks 当前出现的锁
  • innodb_lock_waits 锁等待的对应关系

所以我们先查看

select * from information_schema.innodb_trx;

结果如下:

在这里插入图片描述

看到当前有两个事务,一个运行中,一个LOCK WAIT,锁等待,即等待获取锁。从这里,我们看到事务的id、事务开始时间、事务的线程id;

然后我们再执行下面的语句:

select * from information_schema.innodb_locks ;

结果如下:
在这里插入图片描述

最后我们再执行下面的语句:

select * from information_schema.innodb_lock_waits  ;

结果如下:

在这里插入图片描述

所以,如果我们看到一个事务执行时间太长,我们可以杀掉这个事务,

怎么杀掉事务:

比如这个,我们看到trx_id=4F3E的事务一直运行中,执行时间比较长,所以可以把它kill掉。这个事务的线程id=839,

所以我们直接执行:

kill 839

然后我们看到第一个第二个窗口停止等待,事务提交。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值