• SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)


    接上SQL SERVER的锁机制(一)——概述(锁的种类与范围)

     

    二、完整的锁兼容性矩阵(见下图)

     

     对上图的是代码说明:见下图。

     

    三、下表列出了数据库引擎可以锁定的资源。

    名称

    资源

    缩写

    编码

    呈现锁定时,描述该资源的方式

    说明

    数据行

    RID

    RID

    9

    文件编号:分页编号:Slot编号

    用于锁定堆中的单个行的行标识符。

    索引键

    KEY

    KEY

    7

    6字节哈希值

    索引中用于保护可序列化事务中的键范围的行锁。

    分页

    PAGE

    PAG

    6

    文件编号:分页编号

    数据库中的 8 KB 页,例如数据页或索引页。

    范围

    EXTENT

    EXT

    8

    文件编号:范围的第一个分页的编号

    一组连续的八页,例如数据页或索引页。

     

    HoBT

         

    堆或 树。 用于保护没有聚集索引的表中的 树(索引)或堆数据页的锁。

    数据表

    TABLE

    TAB

    5

    数据表IDOBJID字段)

    包括所有数据和索引的整个表。

    文件

    FILE

    FIL

    3

    文件编号

    数据库文件。

    应用程序

    APPLICATION

    APP

    10

    6字节哈希值

    应用程序专用的资源。

     

    METADATA

         

    元数据锁。

     

    ALLOCATION_UNIT

         

    分配单元。

    数据库

    DATABASE

    DB

    2

    数据库代码(DBID字段)

    整个数据库。

    索引

     

    IDX

    4

    Db_id:object_id:index_id相关的其他资源

    索引中的数据行锁定,

     

     

     

     

    四、SQL SERVER要锁定资源时,默认是从最底级开始锁起,例如,索引键值,数据行,以避免大范围锁定,以避免影响其他人同时访问该范围内的其他数据,但是当内存不足时,SQL SERVER会自动扩大锁定范围以减低管理锁定的负荷。下面我们来看一个示例。

     

    --建立SP_LOCK输出缓存表
    
    if exists( select * from tempdb..sysobjects where name like '#temp%' and type ='u')
    
    begin
    
    drop table #temp
    
    create table #temp(spid int,dbid int ,objid int,indid int,type varchar(3),resource varchar(20)
    
    ,mode varchar(20),status varchar(5))
    
    end
    
    begin tran
    
    update WBK_PDE_head set [COP_EMS_NO]='abcde' where wbook_no='BE404942850177'
    
    insert #temp exec sp_lock @@spid
    
    commit tran
    
     
    
    -----获取dbid
    
    --select DB_ID('Test')
    
    --只查看定制的数据库的相关资源,sql 2008
    
    select spid,数据库=DB_NAME(dbid),对象=OBJECT_NAME(objid),
    
    索引=(select name from sysindexes where ID=OBJID and indid=t.indid ),
    
    TYPE,resource,mode,status from #temp t where dbid=28
    
    order by dbid,objid,indid
    
    ---
    
    ---以SQL 2005的sys.indexes表查询相关数据
    
     
    
    select spid,数据库=DB_NAME(dbid),对象=OBJECT_NAME(objid),
    
    索引=(select name from sys.indexes where object_id=OBJID and index_id=t.indid ),
    
    TYPE,resource,mode,status from #temp t where dbid=28
    
    order by dbid,objid,indid

    说明:

    1.建立临时表#Temp用以存储系统存储过程sp_lock输出的数据

    2.开启事务,然后更新数据(update),但不去确认事务,数据库会锁定相关对象,将sp_lock所呈现的相关数据插入到#Temp表中,并将结果查询出来。

     

    在查询分析器中执行以下代码

     

    select a.*,b.name from #temp a left join sysobjects b on a.objid=b.id 
    
    order by a.type

    图如下示:

     

     

    另外的示例可以参见SQL SERVER的锁机制(一)——概述(锁的种类与范围)中的“示例代码二”相内容。

  • 相关阅读:
    SQL Server:创建索引视图
    Asp.Net常用函数
    SQL Server联机丛书:删除存储过程
    音乐知识全接触
    深入透析样式表滤镜
    有一天,爸妈会变老
    今天终于买到票啦~~
    今天,回到上海啦~~(附工作生涯回顾)
    十八问:怎么才是喜欢编程
    把旧光驱改CD播放机的方法
  • 原文地址:https://www.cnblogs.com/chillsrc/p/3024853.html
Copyright © 2020-2023  润新知