关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »SQL Server 2008中SQL应用之二“锁定(locking)”

    SQL Server 2008中SQL应用之二“锁定(locking)”

    2011-03-11 10:35:00 出处:ITJS
    分享

    一、锁的基本概念:

    锁定(Locking)是一个关系型数据库系统的常规和必要的一部分,它防止对相同数据作 并发更新 或在更新过程中查看数据, 从而保证被更新数据的完整性。它也能防止用户读取正在被修改的数据 。Sql Server动态地管理锁定,然而,还是很有必要了解Transact- SQL查询如何影响SQL Server中的锁定。在此,简单介绍下锁的基本常识。

    锁定有助于防止并发问题的发生。当一个用户试图读取另一个用户正在修改的数据,或者修改另一个用户正在读取的数据时,或者尝试修改另一个事务正在尝试修改的数据时,就会出现并发问题。

    SQL Server资源会被锁定,资源的锁定方式称作它的锁定模式(lock mode),下表列出SQL Server处理的主要锁定模式:

    名称       描述
    共享 (S)  用于不更改或不更新数据的读取操作,如 SELECT 语句。  
    更新 (U)     用于可更新的资源中。 防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 
    排他 (X)      用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。 确保不会同时对同一资源进行多重更新。
    意向   用于建立锁的层次结构。 意向锁包含三种类型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。  
    架构   在执行依赖于表架构的操作时使用。 架构锁包含两种类型:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。  
    大容量更新 (BU)    在向表进行大容量数据复制且指定了TABLOCK 提示时使用。  
    键范围    当使用可序列化事务隔离级别时保护查询读取的行的范围。 确保再次运行查询时其他事务无法插入符合可序列化事务的查询的行。

    可以锁定SQL Server中的各种对象,既可以是一个行,也可以是一个表或数据库。可以锁定的资源在粒度(granularity)上差异很大。从细(行)到粗(数据库)。细粒度锁允许更大的数据库并发,因为用户能对某些未锁定的行执行查询。然而,每个由SQL Server产生的锁都需要内存,所以数以千计独立的行级别的锁也会影响SQL Server的性能。粗粒度的锁降低了并发性,但消耗的资源也较少。下表介绍SQL Server可以锁定的资源:

    资源 说明
     KEY  索引中用于保护可序列化事务中的键范围的行锁。 
    PAGE 数据库中的 8 KB 页,例如数据页或索引页。
    EXTENT 一组连续的八页,例如数据页或索引页。
    HoBT  堆或B 树。 用于保护没有聚集索引的表中的 B 树(索引)或堆数据页的锁。
    TABLE  包括所有数据和索引的整个表。
    FILE  数据库文件。
    RID   用于锁定堆中的单个行的行标识符。
    APPLICATION  应用程序专用的资源。
    METADATA   元数据锁。 
    ALLOCATION_UNIT 分配单元。
    DATABASE  整个数据库。

    不是所有的锁都能彼此兼容。例如,一个被排他锁锁定的资源不能被再加其他锁。其他事务必须等待或超时,直到排他锁被释放。被更新锁锁定的资源只能接受其他事务的共享锁。被共享锁锁定的资源还能接受其他的共享锁或更新锁。

    SQL Server自动分配和升级锁。升级意味着细粒度的锁(行或页锁)被转化为粗粒度的表锁。当单个T-SQL语句在单个表或索引上获取5000多个锁,或者SQL Server实例中的锁数量超过可用内存阈值时,SQL Server会尝试启动锁升级。锁占用系统内存,因此把很多锁转化为一个较大的锁能释放内存资源。然而,在释放内存资源的同时会降低并发性。

    SQL Server 2008带来了新的表选项,可以禁用锁升级或在分区(而不是表)范围启用锁升级。

    二、查看锁的活动

    下面演示一个实例,它使用sys.dm_tran_locks动态视图监视数据库中锁的活动。

    打开一个查询窗口,执行如下语句:

    USE AdventureWorks  BEGIN TRAN  SELECT ProductID, ModifiedDate  FROM Production.ProductDocument  WITH (TABLOCKX) 

    打开另一个查询窗口,执行:

    SELECT request_session_id sessionid,  resource_type type,  resource_database_id dbid,  OBJECT_NAME(resource_associated_entity_id,   resource_database_id) objectname,  request_mode rmode,  request_status rstatus  FROM sys.dm_tran_locks  WHERE resource_type IN ('DATABASE', 'OBJECT') 

    执行结果:

    /*sessionid    type    dbid    objectname    rmode    rstatus       51      DATABASE    4        NULL         S       GRANT      52      DATABASE    4        NULL         S       GRANT      53      DATABASE    8        NULL         S       GRANT        56      DATABASE    8        NULL         S       GRANT      53      OBJECT      8    ProductDocument  X       GRANT */   

    解析:本示例中,我们首先启动了一个新事务,并使用TABLOCKX锁提示(这个提示对表放置了排他锁),对Production.ProductDocument表执行了一个查询。查询sys.dm_tran_locks动态管理视力可以监视当前SQL Server实例中打开了哪些锁。它返回了AdventureWorks数据库中活动锁的列表。可以在结果中的最后一行看到ProductDocument表上的排他锁。

    前三列定义了会话锁、资源类型和数据库ID。第四列使用了Object_Name函数,注意它使用了两个参数(对象ID和数据库ID)来指定访问哪个名称(第二个参数是SQL Server 2005 SP2引入的,它用来指定为了转换对象名称而使用哪个数据库)。同时也查询锁定请求模式和状态,最后,From子句引用DMV,用Where子句指定了两个资源类型。Resource_Type指定了锁定的资源类型,如DatabaseObjectFilePageKeyRIDExtentMetadataApplicationAllocation_Unit或HOBT类型。依赖资源类型的resource_associated_entity_id,确定ID是object ID, allocation unit ID, 或Hobt ID。

    假如resource_associated_entity_id列包含Object ID(资源类型为Object),可以使用sys.objects目录视图来转换名称。

    假如resource_associated_entity_id列包含allocation unit ID(资源类型为Allocation_Unit),可以引用sys.allocatiion_units和contain_id联结到sys.partitions上,就可以确定object ID。

    假如resource_associated_entity_id列包含Hobt ID(资源类型为KeypageRow或HOBT),可以直接引用sys.partitions,然后查找相应的Object ID。

    对于Database、Extent、 Application或MetaData的资源类型,resource_associated_entity_id列将为0。

    使用sys.dm_tran_locks能对无法预料的并发问题进行故障调试。例如,一个查询会话占用锁的时间可能比预期时间长而被锁,或者锁的粒度或锁模式不是我们所期望的(可能是希望使用表锁而不是更小粒度的行锁或页锁)。理解锁处于的锁定级别有助于我们更有效地对查询的并发问题进行故障调试。

    三、控制表的锁升级行为

    每个在SQL Server中创建的锁都会消耗内存资源。当锁的数量增加时,内存就会减少。假如锁的内存使用百分比超过一个特定阈值,SQL Server会将细粒度锁(页或行)转换为粗粒度锁(表锁)。这个过程称为锁升级。锁升级可以减少SQL Server实例占有的锁数量,减少锁内存的使用。

    虽然细粒度会消耗更多的内存,但由于多个查询可以访问未锁定的行,因此也会改善并发性。引入表锁可能会减少内存的消耗,但也会带来阻塞,这是因为一条查询锁住了整个表。根据使用数据库的应用程序,这个行为可能是不希望发生的,而且你可能希望当SQL Server实施锁升级时尽量获得更多的控制。

    SQL Server 2008引入了使用Alter table命令在表级别控制锁升级的功能。现在可以从如下3个设置中选择:

    Table 这是SQL Server 2005中使用的默认行为。当设置为该值时,在表级别启用了锁升级,不论是否为分区表。

    Auto 假如表已分区,则在分区级别(堆或B树)启用锁升级。假如表未分区,锁升级将发生在表级别上。

    Disable 在表级别删除锁升级。注意,对于用了TABLOCK 提示或使用可序列化隔离级别下Heap的查询时,你仍然可能看到表锁。

    下面示例演示了修改表的新设置:

    ALTER TABLE Person.Address  SET (LOCK_ESCALATION = AUTO)--注意这句在SQL Server 2005下会出错  SELECT lock_escalation,lock_escalation_desc  FROM sys.tables  WHERE name='Address'  /*lock_escalation    lock_escalation_desc  2    AUTO  */ 

    下来,我们禁用锁升级:

    ALTER TABLE Person.Address  SET ( LOCK_ESCALATION = DISABLE)  SELECT lock_escalation,lock_escalation_desc  FROM sys.tables  WHERE name='Address'  /*lock_escalation    lock_escalation_desc  1    DISABLE  */ 

    说明:在更改了这个配置后,可以通过查询sys.tables目录视图的lock_escalation_desc列来验证这个选项。

    原文出处:http://www.cnblogs.com/downmoon/archive/2011/02/18/1916117.html

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    微软已修复windows 7/windows 8.1媒体中心严重漏洞 用户可下载安

    卸载MySQL数据库,用rpm如何实现

    windows 7中使用网上银行或支付宝支付时总是打不开支付页面

    一致性哈希算法原理设计

    MySQL数字类型中的三种常用种类

    如何解决SQL Server中传入select语句in范围参数

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。