擦亮自己的眼睛去看SQL Server之谈谈锁机制

在谈谈SQLServer的锁机制之前,来思考以下这个场景:当你在酷暑的时候骑着自己的小车往目的地行走时,路上连续遇到几个时间很长的红灯,是不是很郁闷?有时候你可能实在受不了闯了个红灯,其实在大部分情况下问题不大,如果通行的汽车很多那就不好说了。因为不遵守规则的人太多,都为了达到目的去走捷径,不愿意等待。这样才有了交警。交警的作用就是维护这些红绿灯的规则。这些红绿灯就像锁一样,锁住或延长你去目的地的时间。但是如果没有交警大家又不自由遵守红绿灯规则会导致什么呢?大家想想都知道。

这个系列的一篇文章中提供的事务管理器中有个锁管理器就是这里的交警。它维护着SQLServer中的锁。前段提到的大部分情况指的就是在系统事务量不大的时候,这时候的锁永远不会是什么大问题。除非你知道你的系统永远就给几个人用,否则考虑到系统以后的并发量上升不出现数据与效率问题,那你得深入了解锁机制。在研究锁之前,假定你已经了解事务的ACID概念,它是整个SQLServer的精髓所在。如果没有事务那就不用谈锁了,除了事务需要锁以外其他任何东西都需要这个让SQL不自由的机制。说到底锁是一个平衡并发与数据安全的机制,如果没有锁,任何SQL都能覆盖其他SQL执行的数据,那么数据会出现不一致的情况。如果锁得太狠,那将影响数据库系统的并发性以及效率(包括锁本身带来的额外开销)。这时候就需要去权衡,SQLServer锁管理器就充当权衡这两者关系的角色,如下图所示:

SQLServer中锁的知识点实在太多,比如锁从模式上分为:共享锁(S)、更新锁(U)、排他锁(X)、架构锁(Sch-S、Sch-M)、意向锁(IS、IU、IX)、转换锁(SIX、SIU、UIX)、大容量更新锁(BU);锁从粒度上分为:数据库锁、文件锁、表锁、堆锁、索引锁、页锁、键锁、区锁、行锁、应用程序锁、元数据锁;锁之间存在兼容性问题;锁会根据情况进行升级;锁控制不好会出现死锁;悲观锁的隔离性:未提交读、已提交读、可重复读、可序列化;乐观锁的隔离性:读提交快照隔离、快照隔离;闩(shuan)锁。。。随便列下就一大堆问题要说清楚需要花很大篇幅。还是抱着与前几篇文章的风格,仔细分析一个具体的问题——锁升级。

1、准备

有一个动态管理视图可以查看所有锁:sys.dm_tran_locks,还有一个动态管理视图可以查看哪些请求正在阻塞其他的请求:sys.dm_os_waiting_tasks

2、什么是锁升级

锁升级是指锁的粒度由细向粗转换。如:由行锁转成表锁。

3、需要锁升级吗?

一般来说,锁的粒度越小,并发性越好但是如果去锁定的东西多就需要的锁越多,这样会消耗SQLServer的cpu与内存。一个锁占用内存约为96字节,你算算如果用行锁去锁定百万千万的表需要多少内存。而且管理锁(创建锁、维护锁、销毁锁等)也是有代价的,会消耗cpu。 如果用一个大点的锁就将这些百万千万的锁合并成一个锁了,管理起来也方便消耗资源也小。

4、什么时候出现锁升级

SQLServer意识到锁定的页面或行数过大的时候发生。怎么意识到过大呢?由两种方法识别:请求用于的锁的数目超过锁数目临界值;锁管理器为单独一个查询消耗过多的内存超过内存临界值。有其他一个超过临界值,SQLServer就会试图升级。注意这里说的锁数据以及内存是值由同一个查询发生的,而不是总共的。这里说的临界值并不是固定的,SQLServer采用启发式算法去动态调整。

5、控制锁升级

SQLServer提供一些可以让我们控制锁升级的入口。在SQLServer2008中可以通过:

  1. alter table test 
  2. set (lock_escalation = auto|table|disable) 

我们还可以通过在代码中显示指定pagelock、tablock提示,会强制SQLServer使用更粗的锁。不过这个设置不合理的话会导致并发降低。建议一般情况下不用,除非你很清楚这样带来的影响。

6、举例说明

6.1建库建表:

  1. create database Test 
  2. create table test 
  3. ID identity(1,1) primary key
  4. [Namevarchar(50) not null default ''
  5. CreatedTime datetime not null default getdate(); 

查看当前锁情况:

默认某个连接对整个数据库有个共享锁。

#p#

6.2循环插入几十万条记录: 

  1. while 1 = 1 
  2. insert into test(Namevalues ('kk'

插入时的锁快照 :

 

从上图中看出这个快照中有:三个数据库共享锁、一个页级意向排他锁、一个表级意向排他锁、两个行级排他锁。

三个数据库共享锁:前面已经提过,默认某个连接对整个数据库有个共享锁;

一个页级意向排他锁、一个表级意向排他锁:在页以及表级表示资源的一部分实际已经有锁进行保护,这样的好处允许其他请求锁在表页级别上进行检查,减少不必要的更细的锁请求,提高性能。比如在这种情况下,如果允许alter操作那么这个操作就会等待因为这里有表级排他锁,它提示alter操作该表有活动。

6.3 跟踪Lock:Escalation事件

在profiler中设置只跟踪Lock:Escalation事件,锁升级事件。

6.4更新表中记录:

  1. update test set name = 'name' where name = 'kk' 

在profiler中看到了Lock:Escalation事件被触发:

更新时的快照为(按顺序):

如上图:此时update操作以排他锁定它更新的行。

如上图:此时update操作以排他锁锁定了整个表,以架构稳定锁(Sch-S)锁定它相关的元数据表。

如上图:此时释放了对元数据表的架构稳定锁(Sch-S)锁,剩下对整个表的排他锁。

从上面的分析中,发现SQLServer锁机制是有点复杂的,不过也是很有意思的。研究后,你会发现它真的很智能。今天分析就到此结束,文中如有描述不当的地方,欢迎指出。共同进步才是硬道理。

原文链接:http://www.cnblogs.com/yueyue_jwfm/archive/2011/08/14/2138388.html

【编辑推荐】

  1. 微软SQL Server增加对Hadoop的支持
  2. 数据挖掘逻辑体系结构的内容类型有哪些
  3. SQL Server数据挖掘之如何实现Web路径流挖掘
  4. 整理索引碎片,提升SQL Server速度

 

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/302111.html<

(0)
管理的头像管理
上一篇2025-05-24 15:45
下一篇 2025-05-24 15:46

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注