MySQL如何查看当前数据库锁请求

48次阅读
没有评论

共计 2899 个字符,预计需要花费 8 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下 MySQL 如何查看当前数据库锁请求,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

MySQL 版本:5.6.21

MySQL 提供了查看当前数据库锁请求的三种方法:

1. show  full  processlist 命令
  观察 state 和 info 列

2. show engine  innodb status\G 命令
  查看 TRANSACTIONS 部分和 LATEST DETECTED DEADLOCK 两个部分

3. information_shcema 下的三张表(通过这三张表可以更新监控当前事物并且分析存在的锁问题)
 —— innodb_trx(

打印 innodb 内核中的当前活跃(ACTIVE)事务)

 —— innodb_locks 

(打印当前状态产生的 innodb 锁 仅在有锁等待时打印)

 —— innodb_lock_waits

(打印当前状态产生的 innodb 锁等待 仅在有锁等待时打印)

 1) innodb_trx 表结构说明(摘取最能说明问题的 8 个字段)

字段名
trx_id
innodb 存储引擎内部唯一的事物 ID
trx_state
当前事物状态(running 和 lock wait 两种状态)
trx_started  
事物的开始时间
trx_requested_lock_id
等待事物的锁 ID,如 trx_state 的状态为 Lock wait,那么该值带表当前事物等待之前事物占用资源的 ID,若 trx_state 不是 Lock wait 则该值为 NULL
trx_wait_started
事物等待的开始时间
trx_weight
事物的权重,在 innodb 存储引擎中,当发生死锁需要回滚的时,innodb 存储引擎会选择该值最小的进行回滚
trx_mysql_thread_id
mysql 中的线程 id, 即 show  processlist 显示的结果
trx_query 
事物运行的 SQL 语句

 2)innodb_locks 表结构说明

字段名
lock_id 
锁的 ID
lock_trx_id
事物的 ID
lock_mode
锁的模式(S 锁与 X 锁两种模式)
lock_type
锁的类型 表锁还是行锁(RECORD)
lock_table
要加锁的表
lock_index
锁住的索引
lock_space
锁住对象的 space id
lock_page 
事物锁定页的数量,若是表锁则该值为 NULL
lock_rec
事物锁定行的数量,若是表锁则该值为 NULL
lock_data
事物锁定记录主键值,若是表锁则该值为 NULL(此选项不可信)

 3)innodb_lock_waits 表结构说明
字段名
requesting_trx_id
申请锁资源的事物 ID
requested_lock_id
申请的锁的 ID
blocking_trx_id
阻塞其他事物的事物 ID
blocking_lock_id
阻塞其他锁的锁 ID
可以根据这三张表进行联合查询,得到更直观更清晰的结果,可以参考如下 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\G;
*************************** 1. row ***************************
 trx_isolation_level: REPEATABLE READ
 waiting_trx_id: 2900247
 waiting_trx_thread: 1070
 waiting_trx_state: LOCK WAIT
 waiting_trx_lock_mode: S
 waiting_trx_lock_type: RECORD
 waiting_trx_lock_table: `jiang_test`.`test`
 waiting_trx_lock_index: PRIMARY
 waiting_trx_query: select * from test where id=3 lock in share mode
 blocking_trx_id: 2900241
 blocking_trx_thread: 1137
 blocking_trx_state: RUNNING
 blocking_trx_lock_mode: X
 blocking_trx_lock_type: RECORD
blocking_trx_lock_table: `jiang_test`.`test`
blocking_trx_lock_index: PRIMARY
 blocking_query: NULL
1 row in set (0.01 sec)

以上是“MySQL 如何查看当前数据库锁请求”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-27发表,共计2899字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)