中证500指数市盈率走势图

Sql Server 锁资源模式详解

学习资料,用做备忘

1. 共享锁

共享锁允许并发事务在封闭式并发控制下读取(Select) 资源。资源上存在共享锁(S锁)时,任何其他事物都不能修改数据。

2. 更新锁

在可重复读或可序列化事物中,一个修改需要先读取数据(获取资源页或行的共享锁),然后修改数据(此操作要求锁转换为排它锁)。如果两个事务获得了同一个资源上的共享模式锁,然后试图同时更新数据,则事务会把共享锁转换为排它锁(X锁)。由于两个事务都无法完成转换,因此发生死锁。
为了避免这种潜在的死锁问题,SQL Server 使用更新锁(U)。一次只有一个事务可以获得资源的更新锁。事务真正修改数据时,将更新锁(U)转换为排它锁.

3. 排它锁

排它锁(X 锁)可以防止并发事务对资源进行访问。使用排它锁时,任何其他事务都无法读取或修改数据;仅在使用 NoLock 提示或未提交读隔离级别时才会进行读取操作。

数据修改语句(Insert、Update 或 Delete)合并了修改和读取的操作。语句在执行所需的修改操作之前首先执行读取操作以获得数据。银次,数据修改语句通常请求共享锁和排他锁。例如,Update 语句可能根据与一个表的连接修改另一个表中的行。在此情况下,除了请求更新行上的排他锁之外,Update 语句还将请求语一个表的联接修改另一个表中的行。在此情况下,除了请求更新行上的排它锁之外,Update语句还将请求在联结表中读取行上的共享锁。

4. 意向锁

数据库引擎使用意向锁来保护锁层次的底层资源,以防止其他事务对自己锁住的资源造成伤害,提高锁冲突检测性能。
意向锁可以提高性能,因为数据库引擎仅在表级检查意向锁,确定事务是否能安全滴获取该表上的锁,而不需要检查表中的每行或每页上的锁以确定事务是否可以锁定整个表

5. 架构锁

数据库引擎在表数据定义语言(DDL)操作(例如添加列或删除表)的过程中使用架构修改锁,阻止其他用户对这个表格的访问。

数据库引擎在编译和执行查询时使用架构稳定性(Sch-S)锁,该锁智慧组织对表格做修改型的DDL 操作 和 DML 操作

6. 大容量更新锁

数据库引擎在将数据大容量复制到表中时使用大容量更新(BU)锁,并指定TABLOCK提示或使用sp_tableoption 设置 table lock on bulk load 表选项。大容量更新锁(BU 锁)允许多个现成将数据并发地大容量加载到同一表,同时防止其他不进行大容量加载数据的进程访问表。

7. 键范围锁

在使用可序列化事务隔离级别时,对于 SQL 语句读取的记录集,建范围锁可以隐式保护该记录集中包含的行范围。建范围锁可防止幻读。通过保护行之间建的范围,它还可防止对事务访问的记录集进行幻插入或删除。

锁兼容性控制多个事务能否同时获取同时获取同一资源上的锁。如果资源已被另一个事务锁定,则仅当请求锁的模式与现有锁的模式相兼容时,才会授予新的锁请求。反之,请求新锁的事务将被迫进入等待状态,阻塞也就随之产生。


锁的模式和兼容性是SQL Server预先定义好的,没有任何参数或配置能够去修改它们。

如果应用程序申请的锁粒度都比较小,陈胜阻塞的几率就会比较小。如果一个连接会经常申请页面级、表级,甚至是数据库一级的锁资源,程序产生阻塞的可能性就会很大。

如果一个连接总是能够非常快地把申请到的锁释放掉,那阻塞就不容易发生。如果它总是长时间地持有某些锁资源,那么就很容易发生阻塞了。

影响锁的粒度和持有时间的三个情况:

1. 一个事务内部要访问或者修改的数据量越大,它所要申请的锁的数目就会越多,粒度也就可能越大

2. 一个事务做的事情越复杂,它要申请的锁的范围也就会越大

3. 一个事务延续的时间越长,它持有锁的时间也就会越长

事务的隔离级别能影响锁的申请以及释放的时间;而语句的执行计划,也会影响到锁的粒度以及申请的数量



原文地址:Sql Server 锁资源模式详解

posted @ 2011-09-07 14:13  寻自己  阅读(1217)  评论(3编辑  收藏  举报