获取家长事件信息
该data_locks
表显示了持有和请求的数据锁。该表的行中的一THREAD_ID
列指示拥有锁的会话的线程ID,一EVENT_ID
列指示导致锁的性能架构事件。(THREAD_ID
,EVENT_ID
)值的元组隐式标识其他性能模式表中的父事件:
- 表中的父级等待事件
events_waits_xxx
- 表中的父阶段事件
events_stages_xxx
- 表中的父语句事件
events_statements_xxx
- 在父事务事件
events_transactions_current
表
要获取有关父事件的详细信息,请在相应的父事件表中将THREAD_ID
和EVENT_ID
列与名称相似的列连接在一起。该关系基于嵌套的集合数据模型,因此联接具有多个子句。给定分别由parent
和表示的父表和子表child
,联接看起来像这样:
WHERE parent.THREAD_ID = child.THREAD_ID /* 1 */ AND parent.EVENT_ID < child.EVENT_ID /* 2 */ AND ( child.EVENT_ID <= parent.END_EVENT_ID /* 3a */ OR parent.END_EVENT_ID IS NULL /* 3b */ )
加入的条件是:
- 父事件和子事件在同一线程中。
- 子事件在父事件之后开始,因此其
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
。但是,记录了如此多的等待,以致引起锁定的等待很可能已经从历史表中消失了。
等待,上演和陈述事件从历史记录中迅速消失。如果很久以前执行的一条语句已锁定但处于尚处于打开状态的事务中,则可能无法找到该语句,但可以找到该事务。
这就是为什么嵌套集数据模型可以更好地定位父事件的原因。当中间节点已从历史表中删除后,父/子关系中的以下链接(数据锁定->父等待->父阶段->父事务)将无法正常工作。
以下方案说明了如何查找其中已采取锁定的语句的父事务:
分会A:
[1]START TRANSACTION ; [2]SELECT *FROM t1WHERE pk = 1; [3]SELECT 'Hello, world';
B场:
SELECT ...FROM performance_schema.events_transactions_currentAS parentINNER JOIN performance_schema.data_locksAS childWHERE parent.THREAD_ID = child.THREAD_ID AND parent.EVENT_ID < child.EVENT_ID AND ( child.EVENT_ID <= parent.END_EVENT_ID OR parent.END_EVENT_ID IS NULL );
会话B的查询应显示语句[2]拥有对记录的数据锁pk=1
。
如果会话A执行更多语句,则[2]将从历史记录表中消失。
无论执行了多少语句,阶段或等待,查询都应显示从[1]开始的事务。
要参见更多数据,还可以使用表(事务除外),假设服务器中没有其他查询在运行(这样就保留了历史记录)。events_xxx_history_long