学习一下与innodb有关的表。
1.INNODB_TRX
提供有关当前在内部执行的每个事务 的信息InnoDB,包括事务是否正在等待锁定、事务何时启动以及事务正在执行的 SQL 语句。
主要列:
-
TRX_ID唯一的事务 ID 号 -
TRX_WEIGHT事务的权重,反映(但不一定是确切的计数)更改的行数和事务锁定的行数。为了解决死锁,InnoDB选择权重最小的事务作为“受害者”进行回滚。已更改非事务表的事务被认为比其他事务更重,无论更改和锁定的行数如何。 -
TRX_STATE事务执行状态。允许的值为RUNNING、LOCK WAIT、ROLLING BACK和COMMITTING。 可以判断一定当前事务是否在等待锁 -
TRX_STARTED事务开始时间。 -
TRX_REQUESTED_LOCK_ID事务当前正在等待的锁的ID,如果TRX_STATE是LOCK WAIT;否则NULL。要获取有关锁的详细信息,请将此列与表的LOCK_ID列 连接INNODB_LOCKS。
可以获取当前事务正在等待的锁,便于分析死锁问题。
-
TRX_WAIT_STARTED事务开始等待锁的时间,如果TRX_STATE是LOCK WAIT;否则NULL。 -
TRX_MYSQL_THREAD_IDMySQL 线程 ID。要获取有关线程的详细信息,请将此列与表的ID列 连接INFORMATION_SCHEMAPROCESSLIST -
TRX_QUERY事务正在执行的 SQL 语句。 -
TRX_OPERATION_STATE事务的当前操作,如果有的话;否则NULL。 -
TRX_TABLES_IN_USEInnoDB处理此事务的当前 SQL 语句时使用 的表数。 -
TRX_TABLES_LOCKEDInnoDB当前 SQL 语句具有行锁 的表的数量。(因为这些是行锁,而不是表锁,所以尽管某些行被锁定,但通常仍然可以由多个事务读取和写入表。) -
TRX_LOCK_STRUCTS事务保留的锁数。 -
TRX_LOCK_MEMORY_BYTES此事务的锁结构在内存中占用的总大小。 -
TRX_ROWS_LOCKED此事务锁定的近似数或行数。该值可能包括实际存在但对事务不可见的删除标记行。 -
TRX_ROWS_MODIFIED此事务中修改和插入的行数。 -
TRX_CONCURRENCY_TICKETS一个值,指示当前事务在被换出之前可以做多少工作,由 innodb_concurrency_tickets 系统变量指定。 -
TRX_ISOLATION_LEVEL当前事务的隔离级别。 -
TRX_UNIQUE_CHECKS是否为当前事务打开或关闭唯一检查。例如,它们可能在批量数据加载期间被关闭。 -
TRX_FOREIGN_KEY_CHECKS是否为当前事务打开或关闭外键检查。例如,它们可能在批量数据加载期间被关闭。 -
TRX_LAST_FOREIGN_KEY_ERROR最后一个外键错误的详细错误信息,如果有的话;否则NULL。 -
TRX_ADAPTIVE_HASH_LATCHED自适应哈希索引是否被当前事务锁定。当自适应哈希索引搜索系统被分区时,单个事务不会锁定整个自适应哈希索引。自适应哈希索引分区由 控制 innodb_adaptive_hash_index_parts,默认设置为 8。 -
TRX_ADAPTIVE_HASH_TIMEOUT是否立即放弃自适应哈希索引的搜索锁存器,或者在来自 MySQL 的调用中保留它。当没有自适应哈希索引争用时,该值保持为零,并且语句保留锁存器直到它们完成。在争用期间,它倒计时到零,并且语句在每行查找后立即释放锁存器。当自适应哈希索引搜索系统被分区(由 控制 innodb_adaptive_hash_index_parts)时,该值保持为 0。 -
TRX_IS_READ_ONLY值 1 表示事务是只读的。 -
TRX_AUTOCOMMIT_NON_LOCKING值 1 表示事务是 SELECT不使用FOR UPDATEorLOCK IN SHARED MODE子句的语句,并且在启用的情况下执行, autocommit因此事务仅包含这一个语句。当此列 和TRX_IS_READ_ONLY均为 1 时,InnoDB优化事务以减少与更改表数据的事务相关的开销。
2.INNODB_LOCKS
提供有关InnoDB 事务已请求但尚未获取的每个锁的信息,以及事务持有的阻塞另一个事务的每个锁的信息。主要列:
-
LOCK_ID一个唯一的锁 ID 号 -
LOCK_TRX_ID持有锁的事务的 ID。要获取有关事务的详细信息,请将此列与表的TRX_ID列 连接INNODB_TRX。 -
LOCK_MODE如何请求锁定。允许的锁定模式描述符是S,X,IS,IX,GAP,AUTO_INC, 和UNKNOWN。锁定模式描述符可以结合使用来识别特定的锁定模式。 -
LOCK_TYPE锁的类型。允许的值RECORD适用于行级锁、TABLE表级锁。 -
LOCK_TABLE已锁定或包含锁定记录的表的名称。 -
LOCK_INDEX索引的名称,如果LOCK_TYPE是RECORD; 否则NULL。 -
LOCK_SPACE锁定记录的表空间 ID,如果LOCK_TYPE是RECORD; 否则NULL。 -
LOCK_PAGE锁定记录的页码,如果LOCK_TYPE是RECORD; 否则NULL。 -
LOCK_REC页内被锁定记录的堆号,如果LOCK_TYPE是RECORD; 否则NULL。
3.INNODB_LOCK_WAIT
包含每个阻塞InnoDB 事务的一个或多个行,指示它已请求的锁以及阻塞该请求的任何锁。
主要列:
-
REQUESTING_TRX_ID请求(阻塞)事务的 ID。 -
REQUESTED_LOCK_ID事务正在等待的锁的 ID。要获取有关锁的详细信息,请将此列与表的LOCK_ID列 连接INNODB_LOCKS。 -
BLOCKING_TRX_ID阻塞事务的 ID。 -
BLOCKING_LOCK_ID一个事务持有的锁的 ID,该事务阻止另一个事务继续进行。要获取有关锁的详细信息,请将此列与表的LOCK_ID列连接INNODB_LOCKS。
trx表描述了事务,lock表描述了锁,lock_wait描述了阻塞事务锁之间的关系。
举个例子,新建一张表members

启动事务1
start TRANSACTION;
SELECT * FROM members WHERE id = 1 for UPDATE;
启动事务2
start TRANSACTION;
SELECT * FROM members WHERE id = 1 for UPDATE;
观察当前3张表的状态:
事务表 当前有两个事务 1和2 事务1正在运行 事务2正在等待锁

锁表 当前有个锁,事务1,2都在请求行锁

锁等待表 事务1正在等待事务2的锁

后面多学习使用这些表来诊断分析问题。
4872

被折叠的 条评论
为什么被折叠?



