INNODB_LOCKS与INNODB_LOCK_WAITS表

INFORMATION_SCHEMA.INNODB_LOCKS

此表提供了InnoDB事务 已经请求但是没有获取的锁,和已经持有的阻塞色其他事务的锁。

表里的列如下:

LOCK_ID:

唯一的锁ID号。可以将它视为一个 不透明 的字符串。尽管当前的锁ID中包含 事务ID,锁ID中的数据格式可能随时会更改,所以不要写应用去解析它。锁ID的组成为:事务id:lock_space:lock_page:lock_rec。

LOCK_TRX_ID:持有锁的事务ID

LOCK_MODE:请求锁的方式。允许的模式有 S, X, IS, IX, GAP, AUTO_INC, 和 UNKNOWN。此描述可以在识别锁的模式中结合使用。

LOCK_TYPE:锁的类型。允许的值为 RECORD:行级锁,TABLE:表级锁 两种。

LOCK_TABLE:已经被锁住的,或者包含被锁住行的表名。

LOCK_INDEX:如果LOCK_TYPE是行级锁,则为索引的名称,否则为NULL。

LOCK_SPACE:被锁行的表空间ID,如果不是行锁,则为NULL。

LOCK_PAGE:被锁行的页号,如果不是行锁,则为NULL。

LOCK_REC:被锁行在页里对应的堆号,如果不是行锁,则为NULL。

LOCK_DATA:

锁关联的数据。如果是行锁则会显示,否则为NULL。如果锁在主键索引上,则会显示主键的值。如果锁在唯一的二级索引上,则会显示二级索引值。如果二级索引不是唯一的,则会显示 二级索引值加上主键值。如果没有主键,LOCK_DATA会根据 InnoDB管理聚簇索引使用的规则 显示 选择的唯一索引的值或者唯一的InnoDB内部行的ID号的值。LOCK_DATA为 最高伪记录上的锁 报告 “supremum pseudo-record”,当事务持有锁时,如果包含的锁记录的页不在缓冲池,因为它已经被写入磁盘,InnoDB不会从磁盘检索页面,相反,LOCK_DATA会报告 NULL。

示例:

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS\G
*************************** 1. row ***************************
    lock_id: 3723:72:3:2
lock_trx_id: 3723
  lock_mode: X
  lock_type: RECORD
 lock_table: `mysql`.`t`
 lock_index: PRIMARY
 lock_space: 72
  lock_page: 3
   lock_rec: 2
  lock_data: 1, 9

INFORMATION_SCHEMA INNODB_LOCK_WAITS

此表包含了一行或多行关于阻塞的事务的信息,它会显示已经请求的锁和任何已经阻塞请求的锁。

要获取锁的细节信息,需要关联INNODB_LOCKS表的LOCK_ID字段

表里的列如下:

REQUESTING_TRX_ID :正在请求锁的事务ID,此事务为阻塞状态。

REQUESTED_LOCK_ID:事务正在等待的锁ID。

BLOCKING_TRX_ID :正在阻塞的事务ID。

BLOCKING_LOCK_ID:事务持有的锁ID,该事务正在阻塞另一个事务的执行。

示例:

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS\G
*************************** 1. row ***************************
requesting_trx_id: 3396
requested_lock_id: 3396:91:3:2
  blocking_trx_id: 3395
 blocking_lock_id: 3395:91:3:2

注意:

这两张表在MySQL 5.7.14中已经废弃,在MySQL 8.0中已经移除。

使用这两张表可协助诊断在高并发负载期间发生的性能问题。

你可能感兴趣的:(数据库,数据库,mysql)