### 15.7.6 事务调度

`InnoDB`使用竞争感知事务调度 (CATS) 算法来确定等待锁的事务的优先级。当多个事务在等待同一个对象上的锁时，CATS 算法确定哪个事务首先收到锁。

CATS 算法通过分配调度权重来确定等待事务的优先级，调度权重是根据事务阻塞的事务数计算的。例如，如果两个事务正在等待对同一对象的锁定，则为阻塞最多事务的事务分配更大的调度权重。如果权重相等，则优先考虑等待时间最长的事务。

笔记

在 MySQL 8.0.20 之前，`InnoDB`还使用先进先出 (FIFO) 算法来调度事务，并且 CATS 算法仅在重锁争用情况下使用。MySQL 8.0.20 中的 CATS 算法增强使 FIFO 算法变得多余，允许将其删除。从 MySQL 8.0.20 开始，以前由 FIFO 算法执行的事务调度由 CATS 算法执行。在某些情况下，此更改可能会影响事务被授予锁的顺序。

您可以通过查询来查看事务调度权重`TRX_SCHEDULE_WEIGHT`列中的[`INFORMATION_SCHEMA.INNODB_TRX`](information-schema-innodb-trx-table.html)桌子。仅针对等待交易计算权重。等待事务是那些在`锁定等待`事务执行状态，由`TRX_STATE`柱子。不等待锁的事务报告 NULL`TRX_SCHEDULE_WEIGHT`价值。

[`INNODB_METRICS`](information-schema-innodb-metrics-table.html)提供计数器用于监视代码级事务调度事件。有关使用的信息[`INNODB_METRICS`](information-schema-innodb-metrics-table.html)计数器，见[第 15.15.6 节，“InnoDB 信息\_SCHEMA 指标表”](innodb-information-schema-metrics-table.html).

-   `lock_rec_release_attempts`

    尝试释放记录锁的次数。一次尝试可能会导致释放零个或多个记录锁，因为单个结构中可能存在零个或多个记录锁。

-   `lock_rec_grant_attempts`

    授予记录锁的尝试次数。一次尝试可能会导致授予零个或多个记录锁。

-   `lock_schedule_refreshes`

    分析等待图以更新计划事务权重的次数。
