锁定是用来同步多个用户同时对同一个数据块的访问的一种机制。
锁模式
共享锁(S)
用于不更改或不更新数据的读取操作,如SELECT语句。共享锁允许并发事务在封闭式并发控制下读取资源。资源上存在共享锁(S锁)时,任何其他事务都不能修改数据。读取操作一完成,就立即释放资源上的共享锁(S锁),除非将事务隔离级别设置为可重复读或更高级别,或者在事务持续时间内用锁定提示保留共享锁(S锁)。
更新(U)
用于可更新的资源中,防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见的死锁。
排他(X)
用于数据修改操作,例如INSERT、UPDATE、DELETE。确保不会同时对同一资源进行多重更新。
意向
用于建立锁的层次结构。意向锁的类型有:意向共享(IS),意向排他(IX)以及意向排他共享(SIX)。
架构
在执行依赖于表架构的操作时使用。架构锁的类型有:架构修改(Sch-M)和架构稳定性(Sch-S)。
大容量更新(BU)
在向表进行大容量数据复制且制定了TABLOCK提示时使用。
键范围
当使用可序列化事务隔离级别时保护查询读取的行范围。确保再次运行查询时其他事务无法插入符合可序列化事务的查询的行。
可以锁定的资源RID用于锁定堆中的单个行的行标识符。 KEY索引中用于保护可序列化事务中的键范围的行锁。 PAGE数据库中的8KB页,例如数据库页或索引页。 EXTENT一组连续的八页,例如数据页或索引页。 HOBT堆或B树。保护索引或没有聚集索引的表中数据页堆的锁。 TABLE包括所有数据和索引的整个表。 FILE数据库文件。 APPLICATION应用程序专用的资源。 METADATE元数据锁。 ALLOCATION_UNIT分配单元。 DATABASE整个数据库。  | 
锁兼容性
锁兼容性控制多个事务能否同时获取同一资源上的锁。如果资源已被另一个事务锁定,则仅当请求锁的模式与现有锁的模式相兼容时,才会授予新的锁请求。如果请求锁的模式与现有锁的模式不兼容,则请求新锁的事务将等待释放现有锁或者等待锁超时间隔过期。
完整的锁兼容性矩阵

锁升级
锁升级是将许多较细粒度的锁转换成数量更少的较粗粒度的锁的过程,这样可以减少系统开销,但却增加了并发争用的可能性。
数据库引擎不会将行锁或者键范围锁升级到页锁,而是直接升级到表锁,同样页锁始终升级到表锁。
如果由于并发事务持有相冲突的锁而导致锁升级尝试失败,每当事务又获取1250个锁时,数据库引擎会重试一次锁升级。
锁升级阀值
启动锁升级条件:
Ø 当单个Transact-SQL语句在单个表或索引上获取5000个锁时。
SQL语句必须在同一个堆或者索引上获取5000个锁时,才会引起锁升级,比如在同一个表的一个索引上获取了3000个锁,在该表的另外一个索引上获取2000个锁,也不会触发锁升级;同样,在表或者索引的单个引用上获取5000个锁才会引起锁升级,比如一个表自联接,并且表的每个引用上都获取3000个锁,也不会引起锁升级。
Ø 当数据库引擎实例中的锁的数量超出了内存或者配置阀值时。
每当锁的数量大于锁升级的内存阀值时,每获取1250个新锁,数据库引擎就会定期为锁升级选择语句。
内存阀值取决于locks配置选项的设置:
1) 如果locks选项设置为默认设置0,当锁对象使用的内存是数据库引擎使用得内存的40%(不包括AWE内存)时,将达到锁升级阀值。用于表示锁的升级结构的长度大约为100个字节。阀值是动态的,因为数据库引擎会动态获取并释放内存以适应各种工作负荷。
2) 如果locks选项设置为非0值,则锁升级阀值是locks选项的值的40%(或者更低,如果存在内存不足的压力)。
                    
                
                
            
        
浙公网安备 33010602011771号