最近,当我试图查找有关latch_ex等待类型的信息时,我看到了一个博客,如下所示,它说明了闩锁和锁。

在看完这个博客后,我对一件事感到好奇。当应用程序提交请求时,SQL server将首先查找缓冲区缓存中的信息,如果页面不在缓冲区缓存中,则只有从磁盘读取并放入缓冲区缓存中,然后再发送信息给app。我的问题基于上面的截图,上面写着闩锁和锁,需要避免两个线程更新相同的页面。基本上,所有传入SQL服务器的请求都将首先进入缓冲区缓存,如果缓冲区缓存中的页面忙于更新,则另一个线程将不得不等待。它不会返回到磁盘,因为页面已经在内存中了。那么锁的目的是什么,因为每个请求都将通过内存完成,并且有锁锁来保护页面。
发布于 2019-11-09 19:00:02
我不太明白你在引用中不理解的地方(奇怪的是,作为截图),因为在我看来,它很清楚地解释了不同之处。
锁和锁有不同的作用域和生命周期。锁适用于数据库物理模型元素--表、行、索引项。闩锁保护数据库服务器在执行SQL语句或执行其内部管理任务时使用的各种内存结构。
事务可能对它正在处理的对象持有一个、多个或根本没有锁,这向其他事务指示了它们对这些对象的访问权限。受锁保护的对象不必“在内存中”;例如,由表级锁保护的表甚至可能在缓冲池中没有它的任何页面。
工作线程获取并释放闩锁,以严格防止其他并发运行的线程(可能在同一事务、其他事务中执行任务,或代表某个服务器后台进程)同时访问某些内存区域。例如,两个事务可能对同一个缓冲池页上的不同行持有锁,这不会阻止它们同时访问各自的行,如果不是因为页面锁存确保整个页面对所有读取器和写入器保持一致的话。还有一个懒散的编写进程,它不关心任何这些锁,但在将一致的页面写入磁盘之前仍然必须获得锁存器。
换句话说,锁是一种事务同步机制,而锁则有助于同步进程或线程。
https://dba.stackexchange.com/questions/252888
复制相似问题