14.16.2.3 InnoDB 事务和锁定信息的持久性和一致性
事务 table 和锁定 table(INNODB_TRX,INNODB_LOCKS和INNODB_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_DATA
和INNODB_TRX.TRX_QUERY
),出于安全原因,仅允许具有PROCESS
特权的用户从其中SELECT
。
如上所述,填充事务 table 和锁定 table(INNODB_TRX,INNODB_LOCKS和INNODB_LOCK_WAITS)的数据将自动获取,并保存到提供“时间点”快照的中间缓冲区中。从同一快照查询时,所有三个 table 中的数据都是一致的。但是,基础数据变化如此之快,以至于相似的瞥见其他类似的快速变化的数据可能不会同步。因此,在比较InnoDB
事务中的数据和锁定 table 与PROCESSLISTtable 中的数据时,应格外小心。 PROCESSLISTtable 中的数据与有关锁定和事务的数据来自不同的快照。即使发出单个SELECT
(例如,将INNODB_TRX和PROCESSLIST联接),这些 table 的内容通常也不相同。 INNODB_TRX可能引用PROCESSLIST中不存在的行,或者INNODB_TRX.TRX_QUERY
中所示的事务的当前正在执行的 SQL 查询可能与PROCESSLIST.INFO
中的行不同。