美文网首页
MySQL 缺少索引的数据表更新引起的死锁

MySQL 缺少索引的数据表更新引起的死锁

作者: 杰哥长得帅 | 来源:发表于2018-05-23 12:23 被阅读197次

    使用 sequelize 操作 MySQL 时出现异常 Error: ER_LOCK_WAIT_TIMEOUT: Lock wait timeout exceeded; try restarting transaction
    原因是锁等待超时,当前事务在等待其它事务释放锁资源造成的

    MySQL 默认的级别是 REPEATABLE READ(可重复读),这表示在 MySQL 的默认情况下,“脏读”、“不可重复读” 是不会发生的。这就需要在更新的时候进行必要的锁定(InnoDB 是采用行级锁的方式),从而保证一致性。需要注意的是 InnoDB 的行锁是通过给索引上的索引项加锁来实现的,这个特点意味着:只有通过索引条件检索数据,InnoDB 才使用行级锁,否则,InnoDB 将使用表锁

    错误日志里抛出异常时执行的 SQL 语句,都是类似这样的一条 UPDATE 语句:

    update ... where `originId` = 37206 AND `cover` = \'https://url/img\'
    

    问题产生的原因可以这样来描述了:在执行 UPDATE 语句时,MySQL 会将其当成一个事务,对表的行进行锁定,这时又有其他连接进来要 UPDATE 同样的表或者 SELECT 这张表时就必须等待锁资源,而这个等待时间太久,导致超时了

    解决方法:加索引

    因为 cover 是 text 字段,所以必须选择字段前多少位做索引,或者使用全文索引

    相关文章

      网友评论

          本文标题:MySQL 缺少索引的数据表更新引起的死锁

          本文链接:https://www.haomeiwen.com/subject/oxhrjftx.html