SQL Server资源锁模式大全


  本文标签:SQL Server资源锁模式

  SQL Server资源锁模式都有哪些呢?这是很多人都提到过的问题,下面就为您详细介绍各种SQL Server资源锁模式,希望对您能有所帮助  。

  SQL Server 使用以下SQL Server资源锁模式  。

  锁模式    描述
共享(S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句  。
更新(U) 用于可更新的资源中  。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁  。
排它(X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE  。确保不会同时对同一资源进行多重更新  。
意向 用于建立锁的层次结构  。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)  。
架构 在执行依赖于表架构的操作时使用  。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)  。
大容量更新(BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用  。

  共享锁
共享 (S) 锁允许并发事务读取 (SELECT) 一个资源  。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据  。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁  。

  更新锁
更新 (U) 锁可以防止通常形式的死锁  。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁,然后修改行,此操作要求锁转换为排它 (X) 锁  。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁  。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待  。第二个事务试图获取排它 (X) 锁以进行更新  。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁  。
若要避免这种潜在的死锁问题,请使用更新 (U) 锁  。一次只有一个事务可以获得资源的更新 (U) 锁  。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁  。否则,锁转换为共享锁  。

  排它锁
排它 (X) 锁可以防止并发事务对资源进行访问  。其它事务不能读取或修改排它 (X) 锁锁定的数据  。

  意向锁
意向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排它 (X) 锁  。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享 (S) 锁  。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它 (X) 锁  。意向锁可以提高性能,因为 SQL Server 仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁  。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表  。
意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)  。
锁模式 描述
意向共享 (IS) 通过在各资源上放置 S 锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源  。
意向排它 (IX) 通过在各资源上放置 X 锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源  。IX 是 IS 的超集  。
与意向排它共享 (SIX) 通过在各资源上放置 IX 锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源  。允许顶层资源上的并发 IS 锁  。例如,表的 SIX 锁在表上放置一个 SIX 锁(允许并发 IS 锁),在当前所修改页上放置 IX 锁(在已修改行上放置 X 锁)  。虽然每个资源在一段时间内只能有一个 SIX 锁,以防止其它事务对资源进行更新,但是其它事务可以通过获取表级的 IS 锁来读取层次结构中的底层资源  。

  架构锁
执行表的数据定义语言 (DDL) 操作(例如添加列或除去表)时使用架构修改 (Sch-M) 锁  。
当编译查询时,使用架构稳定性 (Sch-S) 锁  。架构稳定性 (Sch-S) 锁不阻塞任何事务锁,包括排它 (X) 锁  。因此在编译查询时,其它事务(包括在表上有排它 (X) 锁的事务)都能继续运行  。但不能在表上执行 DDL 操作  。

  大容量更新锁
当将数据大容量复制到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 设置了 table lock on bulk 表选项时,将使用大容量更新 (BU) 锁  。大容量更新 (BU) 锁允许进程将数据并发地大容量复制到同一表,同时防止其它不进行大容量复制数据的进程访问该表  。