The rwlock_instances
表列出了 Performance Schema 在服务器执行时所看到的所有的 读写锁 (读写锁) 实例。一个 rwlock
是代码中用于强制执行线程在给定时间可以访问某些公共资源的同步机制,遵循某些规则。该资源被称为由 rwlock
“保护”。访问可以是共享的 (多个线程可以在同一时间拥有一个读锁),独占的 (在给定时间只有一个线程可以拥有一个写锁),或者共享独占的 (一个线程可以拥有一个写锁,同时允许其他线程进行不一致的读取)。共享独占访问也称为 sxlock
,它优化了并发性并提高了读写工作负载的可扩展性。
根据请求锁的线程数量和请求锁的类型,访问可以被授予共享模式、独占模式、共享独占模式,或者根本不被授予,而是等待其他线程先完成。
The rwlock_instances
表具有以下列
NAME
与锁相关的仪器名称。
OBJECT_INSTANCE_BEGIN
仪器化锁在内存中的地址。
WRITE_LOCKED_BY_THREAD_ID
当一个线程当前以独占 (写) 模式锁定了
rwlock
时,WRITE_LOCKED_BY_THREAD_ID
是锁定线程的THREAD_ID
,否则为NULL
。READ_LOCKED_BY_COUNT
当一个线程当前以共享 (读) 模式锁定了
rwlock
时,READ_LOCKED_BY_COUNT
会增加 1。这只是一个计数器,所以不能直接用来查找哪个线程持有读锁,但它可以用来查看rwlock
上是否存在读竞争,以及查看当前有多少读者处于活动状态。
The rwlock_instances
表具有以下索引
主键在 (
OBJECT_INSTANCE_BEGIN
) 上索引在 (
NAME
) 上索引在 (
WRITE_LOCKED_BY_THREAD_ID
) 上
TRUNCATE TABLE
不允许用于 rwlock_instances
表。
通过对以下两个表的执行查询,监控应用程序或 DBA 可以检测到涉及锁的线程之间的某些瓶颈或死锁
events_waits_current
,查看线程正在等待哪个rwlock
rwlock_instances
,查看当前哪个其他线程拥有rwlock
存在一个限制:rwlock_instances
只能用于识别持有写锁的线程,而不能识别持有读锁的线程。