29.12.3.3 锁定实例表
性能模式的mutex_instances
表列出了服务器执行时看到的所有锁定。锁定是一种同步机制,用于在代码中确保只有一个线程可以访问某个共享资源。该资源被称为由锁定“保护”的资源。
当两个线程在服务器中(例如,两个用户会话同时执行查询)需要访问相同的资源(文件、缓冲区或数据片段),这两个线程之间就会竞争,所以第一个查询获得对锁定的锁定将导致第二个查询等待直到第一个完成并释放锁定。
在持有锁定的工作被称为“关键部分”,多个查询会以串行方式(一次一个)执行这个关键部分,这是一个潜在的瓶颈。
性能模式提供以下信息,对于代码中的每个锁定实例化。
-
NAME
与锁定关联的工具名称。
-
OBJECT_INSTANCE_BEGIN
内存中的锁定的起始地址。
-
LOCKED_BY_THREAD_ID
当一个线程当前持有锁定时,
LOCKED_BY_THREAD_ID
是锁定线程的THREAD_ID
,否则为NULL
。
性能模式的mutex_instances
表有以下索引:
-
基于(
OBJECT_INSTANCE_BEGIN
)的主键索引 -
基于(
NAME
)的索引 -
基于(
LOCKED_BY_THREAD_ID
)的索引
TRUNCATE TABLE
不允许对mutex_instances
表进行。
对于代码中的每个锁定实例化,性能模式提供以下信息。
-
性能模式的
setup_ instruments
表列出了工具名称,前缀为wait/synch/mutex/
。 -
当代码创建一个锁定时,将会在
mutex_instances
表中添加一行。OBJECT_INSTANCE_BEGIN
列是唯一标识锁定的属性。 -
当一个线程尝试锁定一个锁定时,性能模式的
events_waits_current
表显示该线程的行,表示它正在等待一个锁定(在EVENT_NAME
列中),并且指示哪个锁定被等待(在OBJECT_INSTANCE_BEGIN
列中)。 -
当一个线程成功地锁定了一个锁定时:
-
events_waits_current
表显示该线程等待锁定的等待已完成(在TIMER_END
和TIMER_WAIT
列中) -
完成的等待事件将被添加到
events_waits_history
和events_waits_history_long
表中 -
mutex_instances
表显示该锁定现在由线程持有(在THREAD_ID
列中)。
-
-
当一个线程解锁了一个锁定时,
mutex_instances
表显示该锁定现在没有所有者(THREAD_ID
列为NULL
)。 -
当一个锁定对象被销毁时,将会从
mutex_instances
表中移除相应的行。
通过对以下两个表格执行查询,监控应用程序或数据库管理员可以检测涉及互斥锁的线程之间的瓶颈或死锁:
-
events_waits_current
, 查看线程正在等待的互斥锁 -
mutex_instances
, 查看当前哪个线程持有了一个互斥锁