SQL Serer闩锁 和 闩锁超时故障排除

翻译自:https://mssqlwiki.com/2012/09/07/latch-timeout-and-sql-server-latch/


在一个多线程的进程里,当一个线程在内存里更新一个数据或索引页,而另一个线程正在读取相同的页,将会发生什么?

当第一个线程在内存里读取一个数据或索引页,而第二个线程正在从内存里释放相同的页,将会发生什么?

答案是:我们将获得数据或数据结构不一致的结果。为了避免不一致,SQL Server使用同步机制像锁(Locks)、闩锁(Latches)和自旋锁(Spinlocks)。

在这篇博文里,我们将讨论关于闩锁的一些关键点和如何排除闩锁超时dump故障。

什么是闩锁(Latch)?

它们通过多线程控制对数据页和结构的并发访问。闩锁提供数据页的物理数据一致性,并提供数据结果的同步。闩锁不可以像锁一样被用户控制。

闩锁的类型:

Buffer(BUF) Latch
用于同步访问BUF结构和它们相关的数据库页。

Buffer "IO" Latch
Buffer Latch的一个子集,用于当BUF和相关的数据/索引页正在一个IO操作(从磁盘读取页或者写入页到磁盘)中间时。

Non-Buffer(Non-BUF) Latch
这些闩锁被用于同步一般的内存中数据结构,这些结构通常被并行线程、自动增长操作和收缩操作等查询/任务执行所使用。

闩锁模式:

Keep(KP) Latches
用于确保当页面正在使用时,不会从内存释放。

Shared(SH) Latches
用于对数据结构的只读访问,和阻止其他线程的写访问。
这个模式允许共享访问。
SH可兼容于KP、SH和UP。应该注意的是,尽管通常SH表明了只读访问,但不总是这样。对于Buffer Latches,SH是为了读取一个数据页的最小模式要求。

Update(UP) Latches
允许对数据结构(兼容于SH和KP)的读访问,但是阻止其他EX-latch访问。
当页分裂检测关闭并且当AWE没有启用时用于写操作。

Exclusive(EX) Latches
阻止发生在被闩锁结构上的读取活动。EX只兼容于KP。
当页分裂检测开启或者AWE启用时在读IO和写IO期间。

Destroy(DT) Latches
用于当从Buffer Pool移除BUFS,要么通过添加它们到空闲列表,要么取消映射AWE Buffers。

闩锁兼容性:

      KP     SH     UP     EX     DT
KP     Y     Y     Y     Y     N
SH     Y     Y     Y     N     N
UP     Y     Y     N     N     N
EX     Y     N     N     N     N
DT     N     N     N     N