15.7.6 事务调度

InnoDB使用竞争感知事务调度(CATS)算法来优先处理正在等待锁的事务。当多个事务在等待同一个对象上的一把锁时,CATS算法会决定哪个事务会先获得锁。

CATS算法处理等待的事务的方法是分配一个调度权重,这个权重是在基于一个事务所阻塞的其它事务的数量来计算的。例如,如果两个事务在等待同一个对象上的一把锁,阻塞的事务更多的那个事务就会获得更高的权重。如果权重相等,就会优先分配给等待时间最长的事务。

在MySQL8.0.20以前,InnoDB也会使用先进先出(FIFO)算法来调度事务,CATS算法只会在锁竞争很严重的情况下才会被使用。在MySQL8.0.20中,CATS算法得到了加强,使FIFO算法变得多余了,所以可以将其移除。从MySQL8.0.20开始,之前通过FIFO算法调度的事务开始通过CATS算法调度。在某些场景中,这个变化可能会影响事务获得锁的顺序。

你可以通过查询Information Schema的INNODB_TRX表的TRX_SCHEDULE_WEIGHT列来查看事务的调度权重。只有等待的事务才会计算权重。等待的事务是指处理 LOCK WAIT事务执行状态的事务(这个状态由TRX_STATE列报告)。一个不在等待锁的事务的TRX_SCHEDULE_WEIGHT列的值为null。

INNODB_METRICS计数器用来提供对代码级别事务调度事件的监控。想了解更多关于INNODB_METRICS计数器的信息,请查阅章节15.15.6,“InnoDB INFORMATION_SCHEMA Metrics Table。”

  • lock_rec_release_attempts 尝试释放记录锁的次数。单次尝试可能会导致0个或多个记录锁被释放,因为一个结构中可能有0个活多个记录锁。
  • lock_rec_grant_attempts 尝试获取记录锁的次数。单次尝试可能会导致0个或多个记录锁被获取。
  • lock_schedule_refreshes 为了更新调度事务权重而分析等待图标的次数。