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