Transaction Scheduling
参考:15.7.6 Transaction Scheduling
InnoDB使用竞争感知事务调度(CATS)算法对等待锁的事务进行优先级排序。 当多个事务正在等待同一对象上的锁时,CATS算法将确定哪个事务首先接收到该锁。
CATS算法通过分配调度权重来确定等待的事务的优先级,调度权重是根据事务阻止的事务数来计算的。 例如,如果两个事务正在等待对同一对象的锁定,则会为阻塞最多事务的事务分配更大的调度权重。 如果权重相等,则优先考虑等待时间最长的事务。
Note
在MySQL 8.0.20之前,InnoDB还使用先进先出(FIFO)算法来调度事务,并且CATS算法仅在重锁争用下使用。 MySQL 8.0.20中的CATS算法增强功能使FIFO算法变得多余,从而可以删除它。 从MySQL 8.0.20开始,以前由FIFO算法执行的事务调度由CATS算法执行。 在某些情况下,此更改可能会影响授予事务的锁的顺序。
您可以通过查询INFORMATION_SCHEMA.INNODB_TRX
表中的TRX_SCHEDULE_WEIGHT
列来查看事务调度权重。权重仅针对等待的事务进行计算。 如TRX_STATE
列所报告,等待的事务是处于LOCK WAIT
事务执行状态的事务。 不等待锁的事务将报告NULL TRX_SCHEDULE_WEIGHT
值。
提供了INNODB_METRICS
计数器,用于监视代码级事务调度事件。 有关使用INNODB_METRICS
计数器的信息:
-
lock_rec_release_attempts
尝试释放记录锁定的次数。 一次尝试可能导致释放零个或多个记录锁,因为单个结构中可能存在零个或多个记录锁。
-
lock_rec_grant_attempts
授予记录锁定的尝试次数。 一次尝试可能会导致授予零个或多个记录锁。
-
lock_schedule_refreshes
分析等待图表以更新计划的交易权重的次数。