使用 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 字段,所以必须选择字段前多少位做索引,或者使用全文索引
网友评论