最近,当我试图查找有关latch_ex 等待类型的信息时,我偶然发现了一篇关于latch 和lock 的博客,如下所示。
读完这篇博客后,我只是对一件事感到好奇。当应用程序提交请求时,SQL Server 将首先在缓冲区缓存中查找信息,如果该页面不在缓冲区缓存中,那么它只会从磁盘读取并将其放入缓冲区缓存中,然后再将信息发送给应用程序。我的问题基于上面的屏幕截图,其中指出闩锁和锁定需要避免两个线程更新同一页面。基本上所有到 SQL Server 的请求都会先到缓冲区缓存,如果缓冲区缓存中的页面忙于更新,另一个线程将不得不等待。它不会回到磁盘,因为页面已经在内存中。那么锁的目的是什么,因为每个请求都将通过内存完成,并且有锁存器来保护页面
我真的不明白你在引用中不理解的内容(奇怪的是,作为截图),因为它非常清楚地解释了差异,在我看来。
锁和闩具有不同的范围和生命周期。锁适用于您可能称之为数据库物理模型元素的东西——表、行、索引条目。锁存器保护数据库服务器在执行 SQL 语句或执行其管理任务时使用的各种内存结构。
一个事务可能在它正在处理的对象上持有一个、多个或根本没有锁,这向其他事务发出信号,它们可以对这些对象进行何种访问。受锁保护的对象不必“在内存中”;例如,受表级锁保护的表甚至可能没有任何页面存在于缓冲池中。
工作线程获取和释放闩锁以严格防止其他并发运行的线程(可能正在同一事务、其他事务或代表某些服务器后台进程中执行任务)同时访问某些内存区域。例如,两个事务可能会为同一缓冲池页面上的不同行持有锁,这不会阻止它们同时访问各自的行,如果不是页面锁存器确保整个页面对所有读取器和写入器保持一致. 然后是一个惰性写入器进程,它不太关心这些锁中的任何一个,但仍然必须获取一个锁存器,然后才能将一致的页面写入磁盘。
换句话说,锁是一种事务同步机制,而锁有助于同步进程或线程。