面试题答案
一键面试使用SHOW语句分析锁争用
-
SHOW STATUS
- 命令:
SHOW STATUS LIKE 'innodb_row_lock%';
- 作用:可以获取InnoDB引擎行锁相关的状态信息。例如,
Innodb_row_lock_current_waits
表示当前正在等待的行锁数量,Innodb_row_lock_time
表示从系统启动到现在锁定的总时长(以毫秒为单位),Innodb_row_lock_time_avg
表示每次等待锁的平均时长等。通过这些指标可以初步判断锁争用的程度。
- 命令:
-
SHOW ENGINE INNODB STATUS
- 命令:
SHOW ENGINE INNODB STATUS;
- 作用:输出InnoDB引擎的详细状态信息,其中包含
LATEST DETECTED DEADLOCK
(最近检测到的死锁)部分,若存在死锁,这里会显示死锁发生时涉及的事务、SQL语句以及锁的相关信息,有助于定位死锁导致的锁争用问题。
- 命令:
使用performance_schema库分析锁争用
- 表
performance_schema.data_locks
- 涉及字段:
ENGINE
:显示锁所属的存储引擎,一般为InnoDB
。THREAD_ID
:持有或等待锁的线程ID。OBJECT_SCHEMA
:涉及的数据库名。OBJECT_NAME
:涉及的表名。LOCK_TYPE
:锁的类型,如ROW
(行锁)、TABLE
(表锁)等。LOCK_MODE
:锁的模式,如S
(共享锁)、X
(排他锁)等。LOCK_STATUS
:锁的状态,GRANTED
表示已授予,WAITING
表示正在等待。
- 定位方法:通过查询该表,可以根据
LOCK_STATUS
为WAITING
的记录,结合OBJECT_SCHEMA
、OBJECT_NAME
确定发生锁争用的数据库和表;根据LOCK_TYPE
和LOCK_MODE
确定锁的类型和模式;通过THREAD_ID
关联其他表获取更多线程相关信息来定位源头。
- 涉及字段:
- 表
performance_schema.threads
- 涉及字段:
THREAD_ID
:线程ID。PROCESSLIST_ID
:对应的进程列表ID,可与SHOW PROCESSLIST
中的ID对应。NAME
:线程名称,有助于了解线程的功能,如thread/sql/one_connection
表示普通的连接线程。TYPE
:线程类型,如FOREGROUND
(前台线程)或BACKGROUND
(后台线程)。
- 定位方法:通过
data_locks
表中的THREAD_ID
关联到threads
表,可以获取持有或等待锁的线程的详细信息,如线程对应的进程列表ID,进一步通过SHOW PROCESSLIST
查看该线程正在执行的SQL语句,从而定位锁争用的源头。
- 涉及字段:
- 表
performance_schema.events_statements_current
- 涉及字段:
THREAD_ID
:执行语句的线程ID。EVENT_NAME
:事件名称,如statement/sql/select
。SQL_TEXT
:具体执行的SQL语句。
- 定位方法:通过
THREAD_ID
与data_locks
表关联,当发现锁争用相关线程ID后,在此表中查询对应线程正在执行的SQL语句,分析这些语句为何会导致锁争用,进而确定锁争用的影响范围(哪些SQL操作导致了锁争用,这些操作涉及哪些业务逻辑等)。
- 涉及字段: