14.16.2.3 InnoDB 事务和锁定信息的持久性和一致性

事务 table 和锁定 table(INNODB_TRXINNODB_LOCKSINNODB_LOCK_WAITS)公开的数据代 table 对快速变化的数据的一瞥。这与用户 table 不同,用户 table 中的数据仅在应用程序启动的更新发生时才更改。基础数据是内部系统 Management 的数据,并且可以快速更改。

出于性能原因,并且为了最大程度地减少在事务 table 和锁定 table 之间产生误导连接的机会,每当在任何 table 上发出SELECT时,InnoDB就会将所需的事务和锁定信息收集到中间缓冲区中。仅在自上次读取缓冲区以来已超过 0.1 秒时才刷新此缓冲区。原子地,一致地获取填充这三个 table 所需的数据,并将其保存在此全局内部缓冲区中,形成一个时间点“快照”。如果在 0.1 秒内发生了多个 table 访问(就像 MySQL 在这些 table 之间进行联接时几乎可以肯定的那样),那么将使用相同的快照来满足查询。

在单个查询中将这些 table 中的任何一个连接在一起时,将返回正确的结果,因为这三个 table 的数据来自同一快照。因为没有使用这些 table 中的每个查询刷新缓冲区,所以如果您在十分之一秒内对这些 table 发出单独的查询,则每个查询的结果都是相同的。另一方面,由于数据来自不同的快照,所以对相同或不同的 table 进行两次单独的查询间隔超过十分之一秒可能会看到不同的结果。

由于InnoDB必须在收集事务和锁定数据时暂时停止,因此对这些 table 的查询过于频繁会对其他用户看到的性能产生负面影响。

由于这些 table 包含敏感信息(至少INNODB_LOCKS.LOCK_DATAINNODB_TRX.TRX_QUERY),出于安全原因,仅允许具有PROCESS特权的用户从其中SELECT

如上所述,填充事务 table 和锁定 table(INNODB_TRXINNODB_LOCKSINNODB_LOCK_WAITS)的数据将自动获取,并保存到提供“时间点”快照的中间缓冲区中。从同一快照查询时,所有三个 table 中的数据都是一致的。但是,基础数据变化如此之快,以至于相似的瞥见其他类似的快速变化的数据可能不会同步。因此,在比较InnoDB事务中的数据和锁定 table 与PROCESSLISTtable 中的数据时,应格外小心。 PROCESSLISTtable 中的数据与有关锁定和事务的数据来自不同的快照。即使发出单个SELECT(例如,将INNODB_TRXPROCESSLIST联接),这些 table 的内容通常也不相同。 INNODB_TRX可能引用PROCESSLIST中不存在的行,或者INNODB_TRX.TRX_QUERY中所示的事务的当前正在执行的 SQL 查询可能与PROCESSLIST.INFO中的行不同。