SQLServer闩锁简介
在今天的文章中,我想谈的更先进的、轻量级的同步对象的SQL Server使用:闩锁(锁),锁存器是SQL Server的存储引擎,采用轻量级的同步对象保护多线程访问内存的内部结构。在文章的第一部分,我将介绍为什么锁在SQL Server要求。在第二部分中,我将向您介绍各种锁存类型,以及如何对它们进行故障排除。为什么我们需要锁上锁
门闩被介绍了在SQL Server 7中的第一次,而微软推出的行级首次锁定。引入锁存器行级锁的概念是非常重要的,否则更新丢失的现象会出现在内存中。就像我说的,锁是一个轻量级的同步对象的存储发动机使用的是SQL Server用来保护存储器结构。锁无非是多线程编程中所谓的临界截面的概念。
在传统的并行编程,临界区的代码,只能运行在同一时间,单线程,锁本身是一个特殊的版本的一个重要领域,因为它允许多个并发的读操作,在SQL Server中,这意味着多个线程可以同时读取共享数据结构,如页面在内存中,但写共享数据结构必须是一个单线程。
锁存器是用于协调多个线程在数据库的物理执行,但锁是基于选定的事务隔离级别,以获得所需的逻辑隔离的水平。作为一个开发人员或DBA,你可以以不同的方式影响锁-例如,通过在SQL Server中的隔离级别,或通过各种可用的锁提示。另一方面,锁存器不可以直接的方式控制。在SQL Server没有锁提示,无锁的隔离级别是可用的。下表是锁和锁存器的比较。
锁(锁)闩锁(锁存器)
控制…事务线程
保护数据库内容内存中的数据结构
模式…共享(共享),保持(保持),
更新(更新),共享(共享),
独家,更新,独家,
意图(内涵)毁灭(毁灭)
死锁的检测和解决(…detectionresolution)是通过严格的代码无效
保持在…的数据结构(受保护的数据结构)通过锁管理器的哈希表(HashTable)保护
从表中可以看出,锁存器支持更细粒度的保留(保持)和破坏模式。锁存器主要用来指计数,例如,当你想知道有多少其他锁存器在指定的闩锁上等待时。破坏锁存器是最有限的锁存器(它甚至阻塞和保持锁存器)。当闩锁被破坏时,它将被使用,例如,当懒惰的作者想要在内存中释放页面时。我们首先介绍各种锁存模式,然后说每个锁存模式的兼容性。
NL(空锁存器):
里面
不习惯
闩锁(保持闩锁):
可以同时完成多项任务。
仅由dt模式锁存器阻塞
共享锁存器:
读取数据页时,使用它
可由多个任务同事担任
闭锁前模式闩锁和dt模式
向上(更新锁存器):
当使用写系统分配页和tempdb的行版页
这种模式的闩锁只能由一个任务完成。
前(行锁):
在向数据页写入时,使用
这种模式的闩锁只能由一个任务完成。
破坏锁存器:
很少使用
这种模式的闩锁只能由一个任务完成。
在SQL Server中,一致性不能得到locking.sql服务器只能访问共享数据结构不锁管理器保护,如标题,基于锁存库的SQL Server的其他组件也有一个单线程的代码路径。好的,我们会继续解释各种SQL Server锁的类型和如何解决他们。
锁存器类型及故障排除
SQL Server区分3种不同的锁类
IO锁
缓冲锁存器(BUF)
非缓冲锁存器(无缓冲)
让我们在3个不同的类别,详细看。当页读写操作不在缓冲池中,完成后,当你读/写你的存储子系统(2不同步),SQL Server将使用IO我 / O(锁)。这些我输出锁存器,SQL Server出现在pageiolatch_统计信息的前缀,你可以看到这些锁的类型在DMV sys.dm_os_wait_stats等待。
复制代码代码如下:SELECT * FROM sys.dm_os_wait_stats哪里wait_type like'pageiolatch_ %
使用这些锁存器,SQL Server确保这些页面不会多次读取到缓存池中,并且在需要访问这些页面时,这些页面不会被缓存池忽略。
除了这些我/ O锁存器,SQL Server也支持所谓的缓冲锁存器,它是用来保护缓冲池中的页被线程同时运行的影响。这些锁存器,SQL Server使用它们来防止记忆丧失的更新(更新丢失)。如果没有这样的锁存器,会有并发读写在缓冲池页面,这可能会导致内存页的损害。这些缓存锁,SQL Server出现在pagelatch_统计信息的前缀,你可以看到这些锁类型在DMV sys.dm_os_wait_stats.the最重要的事情是,你与主存储器的竞争,因为他们的等待类型名称不包含IO。
复制代码代码如下:SELECT * FROM sys.dm_os_wait_stats哪里wait_type like'pagelatch_ %
最后,SQL Server使用所谓的非缓存区的闩锁(非缓冲锁存器)来保护共享数据结构之外的缓冲池。这些非缓存锁,SQL Server出现在latch_统计信息的前缀,你可以看到这些锁的类型在DMV sys.dm_os_wait_stats等待。
复制代码代码如下:SELECT * FROM sys.dm_os_wait_stats哪里wait_type like'latch_ %
但在这个车管所,等待非缓冲锁存器是SQL Server中的各种锁的一般信息,你可以在单独的DMV sys.dm_os_latch_stats找到更详细的信息。
复制代码如下:SELECT * FROM sys.dm_os_latch_stats
SQL Server 2014使用163个锁存器同步访问共享数据结构。一个著名的锁存器是fgcb_add_remove,它是用来保护文件组的文件组和对照组文件控制块(fgcb),在接下来的具体操作期。
文件增长(手动或自动)
添加/删除文件组文件
重新计算填充重力(重新计算权重比例填充)
在循环分配期间,文件由文件组回收。
当你看到在前排的锁,你必须有太多的自动增长操作,因为您的数据库坏的默认配置。当查询试图读/写保护的数据结构,需要等待一个锁存器,查询到挂起状态,直到锁可以取得成功。所以整个生命周期后查询查询运行(运行),挂(吊),运行(运行)运行,并再次运行。因此,它是有意义的给力保护共享数据结构的查询时,长时间锁定,因为改变查询状态也意味着在Windows系统的上下文切换,这是基于CPU周期推出一个昂贵的操作。
因此,读取或写入频繁或极短时间的共享数据结构对锁没有意义,在这种情况下,需要的上下文切换将扼杀SQL Server的整体性能。它将花费太多的时间来完成整个查询的生命周期(运行),停止(暂停),运行(运行)。这就是所谓的自旋锁(自旋锁)通过SQL Server的介绍。锁管理器是这样的一个数据结构的一个很好的例子:只有一个线程需要锁或打开一个数据对象(如记录、网页,等等),但是当你看看sys.dm_os_latch_stats,你会发现没有锁保护锁管理器本身,锁管理器使用Hasibiu Lee相应的哈希桶使用自旋锁来保护lock_hash自旋锁,自旋锁之前必须锁定和解锁操作是通过锁管理器得到的。
以上就是这篇文章的全部内容,希望大家能喜欢。