这data_locks.
表显示了持有和请求的数据锁。这个表的行有THREAD_ID
列表示拥有锁的会话的线程ID,以及event_id.
列,指示导致锁的Performance Schema事件。元组(THREAD_ID
那event_id.
)在其他性能架构表中隐式标识父事件的值:
中的父等待事件
events_waits_
表xxx
中的父阶段事件
events_stages_
表xxx
中的父语句事件
events_statements_
表xxx
父事务事件中
events_transactions_current.
表格
要获取有关父事件的详细信息,请加入THREAD_ID
和event_id.
在相应的父事件表中具有类似名称的列。该关系基于嵌套的集数据模型,因此联接有几个子句。给定父表和子表由父母
和孩子
,连接是这样的:
where parent.thread_id = child.thread_id / * 1 * / event_id
加入的应付是:
父事件在同一主题中。
子事件在父事件之后开始,因此
event_id.
值大于父节点的值。父事件已完成或仍在运行。
要查找锁信息,data_locks.
是包含子事件的表。
这data_locks.
表只显示了现有的锁,所以这些注意事项适用于包含父事件的表:
对于交易,唯一的选择是
events_transactions_current.
.如果一个事务完成了,它可能在事务历史表中,但是锁已经消失了。对于语句,这一切都取决于拍摄锁的语句是否是已经完成的事务中的语句(使用
events_statements_history.
)或陈述仍在运行(使用events_statements_current
).对于阶段,逻辑类似于陈述;用
events_stages_history.
或者events_stages_current
.对于等待,逻辑与陈述类似;用
events_waits_history.
或者events_waits_current.
.但是,录制了许多等待的等待锁定的等待最有可能从历史表中消失。
等待、阶段和语句事件很快从历史中消失。如果一个很久以前执行的语句获得了一个锁,但它仍然处于一个打开的事务中,那么可能无法找到该语句,但可以找到该事务。
这就是为什么嵌套集数据模型更好地用于定位父事件的原因。在父/子关系中的链接之后(数据锁定 - >父等候 - >父阶段 - >父事务)在从历史表中已消失中间节点时不起作用。
以下方案说明了如何查找拍摄锁定的语句的父事务:
会话:
[1]开始交易;[2] SELECT * FROM t1 WHERE pk = 1;[3] SELECT 'Hello, world';
会议B:
从performence_schema.events_transactions_current选择...作为父inner joints_current作为parent.thread_id = child.thread_id和parent.event_id
会话B的查询应该将语句[2]显示为在记录上拥有数据锁定pk = 1
.
如果会话A执行更多语句,[2]将淡出历史表。
无论执行了多少语句、阶段或等待,查询都应该显示在[1]中开始的事务。
要查看更多数据,还可以使用events_
表(事务除外),假设没有其他查询在服务器中运行(以便保存历史)。xxx
_history_long.