背景
当用户并发尝试访问同一数据的时,SQL Server尝试用锁来隔离不一致的数据和使用隔离级别查询数据时控制一致性(数据该如何读取),说起锁就会联想到事务,事务是一个工作单元,包括查询/更新数据和数据定义。
锁
锁类型
在SQL Server中,根据资源的不同,锁分为以下三种类型:
行锁:是SQL Server中数据级别中粒度最小的锁级别,行锁根据表是否存在聚集索引,分为键值锁和标识锁
页锁:针对某个数据页添加的锁,在T-SQL语句中,使用了页锁就不会在使用相同类型的行锁,反之依然,在对数据页加锁后,无法在对其添加不兼容的锁
表锁:添加表锁则无法添加与其不兼容的页?锁和行锁
锁模式
共享锁(S):发生在数据查找之前,多个事务的共享锁之间可以共存
排他锁(X):发生在数据更新之前,排他锁是一个独占锁,与其他锁都不兼容
更新锁(U):发生在更新语句中,更新锁用来查找数据,当查找的数据不是要更新的数据时转化为S锁,当是要更新的数据时转化为X锁
意向锁:发生在较低粒度级别的资源获取之前,表示对该资源下低粒度的资源添加对应的锁,意向锁有分为:意向共享锁(IS) ,意向排他锁(IX),意向更新锁(IU),共享意向排他锁(SIX),共享意向更新锁(SIU),更新意向排他锁(UIX)
共享锁/排他锁/更新锁一般作用在较低级别上,例如数据行或数据页,意向锁一般作用在较高的级别上,例如数据表或数据。锁是有层级结构的,若在数据行上持有排他锁的时候,则会在所在的数据页上持有意向排他锁. 在一个事务中,可能由于锁持有的时间太长或个数太多,出于节约资源的考虑,会造成锁升级
除了上述的锁之外,还有几个特殊类型的锁,例如架构锁,架构锁包含两种模式,架构稳定锁(Sch-S)和架构更新锁(Sch-M) ,架构稳定锁用来稳定架构,当查询表数据的时候,会对表添加架构稳定锁,防止架构发生改变。当执行DDL语句的时候,会使用架构更新锁,确保没有任何资源对表的占用。大数据量的表避免执行DDL操作,这样会造成架构更新锁长时间占用资源,影响其他操作,除非必要不然不要执行DDL语句,如在必要的情况下添加字段,需要先给字段初始化,在设置为非空。
锁的兼容性
如何查看一个事务中所请求的锁类型和锁的顺序,可使用SQL Profiler 查看 Mode 属性
数据准备
延伸阅读
- ssh框架 2016-09-30
- 阿里移动安全 [无线安全]玩转无线电——不安全的蓝牙锁 2017-07-26
- 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 论文笔记【图片目标分割】 2017-07-26
- 词向量-LRWE模型-更好地识别反义词同义词 2017-07-26
- 从栈不平衡问题 理解 calling convention 2017-07-26
- php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明 2017-07-26
- Swift实现JSON转Model - HandyJSON使用讲解 2017-07-26
- 阿里移动安全 Android端恶意锁屏勒索应用分析 2017-07-26
- 集合结合数据结构来看看(二) 2017-07-26