本文介绍为闩锁等待填充表中的阻塞列 sysprocesses
。
原始产品版本:SQL Server
原始 KB 数: 906344
总结
在 SQL Server 中,你可能会注意到,除了锁定等待之外,系统表中的阻塞列 sysprocesses
还会填充闩锁等待。 有时,当单个服务器进程 ID(SPID)报告为阻止本身时,你可能会注意到短暂的时间段。 这是预期的行为。
详细信息
闩锁用于同步对缓存的数据页和其他内存中对象的访问。 通常,闩锁只短暂保存,闩锁等待时间相应较小。 SQL Server 提供诊断来帮助排查 SPID 长时间等待闩锁的情况。 这些诊断会导致系统表中的阻塞列 sysprocesses
反映闩锁的所有者,该闩锁阻止了另一个 SPID 的闩锁请求。
闩锁所有权仅针对处于独占(EX)或更新(UP)闩锁模式的闩锁进行跟踪。 对于处于共享(SH)闩锁模式的闩锁,不会跟踪所有权。 这意味着某些闩锁请求不会填充阻止的列。
大多数情况下,如果满足以下条件,则可以忽略阻止列中的值:
- 列中的值
waittime
较低。 waittype
SPID 是闩锁等待类型。
有关列中可能值waittype
的详细信息,请参阅sys.dm_os_wait_stats(Transact-SQL)。
当 SPID 正在等待 I/O 页闩锁时,你可能会注意到被阻止的列简要报告 SPID 正在阻止自身。 此行为是闩锁用于数据页上 I/O 操作的方式的副作用。 当线程发出 I/O 请求时,发出 I/O 请求的 SPID 会获取页面上的闩锁。 所有 SQL Server I/O 操作都是异步的。 因此,如果发出 I/O 请求的 SPID 必须等待请求完成,SPID 将尝试在同一页上获取另一个闩锁。 第二个闩锁被第一个闩锁阻塞。 因此,阻止的列报告 SPID 正在阻止自身。 I/O 请求完成后,释放第一个闩锁。 然后,授予第二个闩锁请求。
例如,可能会出现以下情况:
SPID 55 想要读取缓冲池中不存在的数据页。
SPID 55 获取页面上的 EX 闩锁。 由于内存中尚不存在页面,因此请求的闩锁模式为 EX。 EX 闩锁模式强制其他可能还希望访问页面的 SPID 等待 I/O 请求完成。 EX 闩锁模式还阻止其他 SPID 为同一页发出重复的 I/O 请求。
SPID 55 发出从磁盘读取页面的 I/O 请求。
由于 SPID 55 想要读取页面,SPID 55 必须等待 I/O 请求完成。 若要等待 I/O 请求完成,SPID 55 会尝试获取同一页上具有共享闩锁模式的另一个闩锁。 由于已获取 EX 闩锁,因此 SH 闩锁请求被阻止,SPID 挂起。 由于阻止 SH 闩锁请求的 EX 闩锁也由 SPID 55 获取,因此 SPID 暂时报告为阻塞本身。
I/O 请求完成后,页面上的 EX 闩锁将释放。
EX 闩锁的释放为 SPID 55 提供 SH 闩锁。
SPID 55 现在可以读取页面。
在步骤 4 和步骤 5 之间,表 sysprocesses
指示 SPID 55 本身与 PAGEIOLATCH_XX 的等待类型一起被阻止。 在此 waittype 中, XX 可以是 SH、UP 或 EX。 此行为指示 SPID 55 发出 I/O 请求,SPID 55 正在等待 I/O 请求完成。