mysql的gap锁导致Lock wait timeout exceeded try restarting transaction异常

问题:

今天同事碰到了在mysql对表进行insert的时候报Lock wait timeout exceeded try restarting transaction的异常,在这里记录一下。

原因是update的时候给二级索引加了gap锁导致insert等待锁,再加上某个数据库节点有点异常,update更新慢,最终导致insert等待锁超时。gap锁是会锁住二级索引一定范围内的记录,这个时候要insert的时候落在这个范围内,就需要等待锁释放,update语句在长事务里或者执行慢了,insert就会出现所等待超时。


解决方法:

在update的时候where条件中尽量用主键id或者唯一索引


关于gap锁:

1.间隙锁主要是防止幻象读,用在Repeated-Read(简称RR)隔离级别下,在Read-Commited(简称RC)下,一般没有间隙锁(有外键情况下例外,此处不考虑)。间隙锁还用于statement based replication。

2.间隙锁有些副作用,如果要关闭,一是将会话隔离级别改到RC下,或者开启 innodb_locks_unsafe_for_binlog(默认是OFF)。

3.间隙锁只会出现在辅助索引上,唯一索引和主键索引是没有间隙锁。间隙锁(无论是S还是X)只会阻塞insert操作。


更多资料可以参考:http://tech.meituan.com/innodb-lock.html

http://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值