引言
本篇引入锁的概念和查看锁的命令。
锁类型
InnoDB存储引擎实现了下面两种标准的行级锁。
共享锁(S Lock):允许事务读一行数据。
排他锁(X Lock):允许事务删除或更改一行数据。
其中共享锁是兼容的,X锁与任何的锁都不兼容。
查看锁请求信息命令
show engine innodb status查看锁请求信息
比如上面执行的sql语句是
select * from user_borrow force index(key_userId) where user_id < 3 for update
“RECODE LOCKS 并且lock_mode 是X(排他锁)”。
Innodb 1.0开始,在 INFORMATION_SCHEMA 架构下添加了表INNODB_TRX、
INNODB_LOCKS、
INNODB_LOCK_WAITS
通过这三张表,可以更好地分析可能存在的锁问题。
select * from information_schema.innodb_trx
查看当前事务情况
select * from information_schema.innodb_locks
查看当前锁持有情况
select * from information_schema.innodb_lock_waits
查看当前锁等待情况
可以用下面这个sql来连表查询,更清晰。
select
r.trx_isolation_level,
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_trx_thread,
r.trx_state waiting_trx_state,
lr.lock_mode waiting_trx_lock_mode,
lr.lock_type waiting_trx_lock_type,
lr.lock_table waiting_trx_lock_table,
lr.lock_index waiting_trx_lock_index,
r.trx_query waiting_trx_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_trx_thread,
b.trx_state blocking_trx_state,
lb.lock_mode blocking_trx_lock_mode,
lb.lock_type blocking_trx_lock_type,
lb.lock_table blocking_trx_lock_table,
lb.lock_index blocking_trx_lock_index,
b.trx_query blocking_query
from information_schema.innodb_lock_waits w
inner join information_schema.innodb_trx b
on b.trx_id=w.blocking_trx_id
inner join information_schema.innodb_trx r
on r.trx_id=w.requesting_trx_id
inner join information_schema.innodb_locks lb
on lb.lock_trx_id=w.blocking_trx_id
inner join information_schema.innodb_locks lr
on lr.lock_trx_id=w.requesting_trx_id;