博智互联吧 关注:1贴子:70
  • 1回复贴,共1

MySQL锁情况分析

只看楼主收藏回复

TIPS
本文基于MySQL 8.0.22
分析锁的三种方式
方式1:
1 show status like '%innodb_row_lock%';
可查看行锁相关的统计信息
方式2:
1 SHOW ENGINE INNODB STATUS;
关注结果中 TRANSACTIONS 段落
方式3:利用锁、事务相关的表
MySQL 5.7 MySQL 8.x
INFORMATION_SCHEMA.INNODB_TRX 官方文档 INFORMATION_SCHEMA.INNODB_TRX 官方文档
INFORMATION_SCHEMA.INNODB_LOCKS 官方文档 PERFORMANCE.DATA_LOCKS 官方文档
INFORMATION_SCHEMA.INNODB_LOCK_WAITS 官方文档 PERFORMANCE.DATA_LOCKS_WAITS 官方文档
锁相关的表
MySQL主要有三张和锁有关的表,不同的版本,表还不太一样,这里我列出来了:
MySQL 5.7 MySQL 8.x 作用
INFORMATION_SCHEMA.INNODB_TRX 官方文档 INFORMATION_SCHEMA.INNODB_TRX 官方文档 当前事务的执行情况
INFORMATION_SCHEMA.INNODB_LOCKS 官方文档 PERFORMANCE.DATA_LOCKS 官方文档 锁相关信息
INFORMATION_SCHEMA.INNODB_LOCK_WAITS 官方文档 PERFORMANCE.DATA_LOCKS_WAITS 官方文档 锁等待信息
INFORMATION_SCHEMA.INNODB_TRX表结构
参考: 官方文档
TRX_ID:InnoDB存储引擎内部唯一的事务ID
TRX_WEIGHT:事务的权重,反映了一个事务修改和锁住的行数。在InnoDB存储引擎中,当发生死锁需要回滚时,InnoDB存储引擎会选择该值最小事务的进行回滚
TRX_STATE:当前事务的状态
TRX_STARTED:事务的开始时间
TRX_REQUESTED_LOCK_ID:当trx_state的状态为LOCK WAIT时,表示当前事务正在等待的锁ID,否则记为NULL。如果想获得更详细的信息,可将该字段和PERFORMANCE.DATA_LOCKS联系起来
TRX_WAIT_STARTED:当trx_state的状态为LOCK WAIT时,表示当前事务开始等待的时间,否则记为NULL
TRX_MYSQL_THREAD_ID:MySQL中的线程ID,SHOW PROCESSLIST显示的结果
TRX_QUERY:事务运行的SQL语句
TRX_OPERATION_STATE:事务当前的操作
TRX_TABLES_IN_USE:事务使用的表的个数
TRX_TABLES_LOCKED:当前SQL语句中拥有行锁的表数目
TRX_LOCK_STRUCTS:事务保留的锁数目
TRX_LOCK_MEMORY_BYTES:内存中此事务的锁占用的内存总大小
TRX_ROWS_LOCKED:此事务大约锁定的行数。这个值可能包含物理存在的、已标记为删除但对事务不可见的记录
TRX_ROWS_MODIFIED:此事务中修改和插入记录的数目
TRX_CONCURRENCY_TICKETS:表示一个事务被swap out之前可以做多少工作,由innodb_concurrency_tickets参数决定
TRX_ISOLATION_LEVEL:当前事务的隔离级别
TRX_UNIQUE_CHECKS:当前事务是否开启了唯一性检查
TRX_FOREIGN_KEY_CHECKS:当前事务是否开启了外键检查
TRX_LAST_FOREIGN_KEY_ERROR:展示最后一个外键错误的详细错误信息
TRX_ADAPTIVE_HASH_LATCHED:自适应hash索引是否被当前事务锁定
TRX_ADAPTIVE_HASH_TIMEOUT:是否要立即放弃搜索自适应hash的锁,还是继续保留。如果没有自适应hash索引争用时,此值是0,争用期间则倒计时到0,并在语句在每次行查找之后立即释放锁
TRX_IS_READ_ONLY:值1表示事务是只读的
TRX_AUTOCOMMIT_NON_LOCKING:值为1表示事务是一个没有使用FOR UPDATE或LOCK IN SHARE MODE子句的SELECT语句,当此值和TRX_IS_READ_ONLY都为1时,innodb会优化事务从而减少更改表事务相关的开销
TRX_SCHEDULE_WEIGHT:由争用感知事务调度(CATS)算法分配给等待锁的事务的事务调度权重,值越大权重越大,此值仅为TRX_STATE字段是LOCK WAIT的事务计算,否则为NULL


IP属地:陕西1楼2021-01-25 09:35回复
    PERFORMANCE.DATA_LOCKS表结构
    参考: 官方文档
    参考:全新的MySQL 8.0行锁观测方式
    ENGINE:持有或请求锁定的存储引擎
    ENGINE_LOCK_ID:存储引擎持有或请求的锁的ID,锁ID格式是内部的,随时可能更改。
    ENGINE_TRANSACTION_ID:请求锁定的事务存储引擎内部ID,可以将其视为锁的所有者
    THREAD_ID:对应事务的线程ID,如果需要获取更详细的信息,需要关联threads表的THREAD_ID
    EVENT_ID:指明造成锁的EVENT_ID,THREAD_ID+EVENT_ID对应parent EVENT,可以在以下几张表内获得信息
    events_waits_xx表查看等待事件
    events_stages_xxx查看到了哪个阶段
    events_statements_xx表查看对应的SQL语句
    events_transactions_current对应查看事务信息
    OBJECT_SCHEMA:对应锁表的schema名称
    OBJECT_NAME:对应锁的表名
    PARTITION_NAME:对应锁的分区名
    SUBPARTITION_NAME:对应锁的子分区名
    INDEX_NAME:锁对应的索引名称,InnoDB表不会为NULL
    OBJECT_INSTANCE_BEGIN:锁对应的内存地址
    LOCK_TYPE:对应的锁类型,对InnoDB而言,可为表锁或者行锁
    LOCK_MODE:锁模式,对应值可能为S[,GAP], X[, GAP], IS[,GAP], IX[,GAP], AUTO_INC和UNKNOWN
    LOCK_STATUS:锁状态,可能为GRANTED或者WAITING
    LOCK_DATA:锁对应的数据,例如如果锁定的是主键,那么该列对应的就是加锁的主键值
    PERFORMANCE.DATA_LOCKS_WAITS表结构
    参考: 官方文档
    参考:全新的MySQL 8.0行锁观测方式
    ENGINE:请求的锁的引擎
    REQUESTING_ENGINE_LOCK_ID:请求的锁在存储引擎中的锁ID
    REQUESTING_ENGINE_TRANSACTION_ID:请求锁的事务对应的事务ID
    REQUESTING_THREAD_ID:请求锁的线程ID
    REQUESTING_EVENT_ID:请求锁的EVENT ID
    REQUESTING_OBJECT_INSTANCE_BEGIN:请求的锁的内存地址
    BLOCKING_ENGINE_LOCK_ID:阻塞的锁的ID,对应data_locks表的ENGINE_LOCK_ID列
    BLOCKING_ENGINE_TRANSACTION_ID:锁阻塞的事务ID
    BLOCKING_THREAD_ID:锁阻塞的线程ID
    BLOCKING_EVENT_ID:锁阻塞的EVENT ID
    BLOCKING_OBJECT_INSTANCE_BEGIN:阻塞的锁内存地址


    IP属地:陕西2楼2021-01-25 09:36
    回复