Akemi

面对锁表,他的选择是……查询锁源

2024/11/01

查看是否有锁表

1
2
3
SHOW STATUS LIKE 'innodb_row_lock%'
Innodb_row_lock_current_waits 当前锁等待数量
Innodb_row_lock_waits 发生过多少锁

锁表的可能原因
1.硬件性能太低——升级硬件
2.处理效率太低,产生阻塞——Mysql性能参数优化
3.SQL语句问题——查询锁源并提交开发

查询锁源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SELECT 
locked_table, //产生锁等待的表
locked_index, //锁的索引
locked_type, //锁类型:record,gap,Next-key
waiting_pid, //正在等待的线程,对应的是processlist里的id
waiting_query, //等待执行的被锁语句
waiting_lock_mode,
blocking_trx_id, //阻塞的trx的id编号
blocking_pid, //阻塞的连接线程id(锁源pid)
sql_kill_blocking_connection //处理建议,可以直接用于KILL的字符串,用于终止阻塞连接
FROM sys.innodb_lock_waits;

通过锁源pid进行查询,获得THREAD_ID
SELECT THREAD_ID,
NAME,
processlist_id
FROM performance_schema.threads
WHERE processlist_id=xx

通过线程id,找到锁源SQL语句
SELECT THREAD_ID,
event_name,
SQL_text FROM performance_schema.`events_statements_current`
WHERE thread_id=xx

然后把sql语句扔给开发优化
CATALOG