zoukankan      html  css  js  c++  java
  • (转)SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)

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

     

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

     

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

    名称

    资源

    缩写

    编码

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

    说明

    数据行

    RID

    RID

    9

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

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

    索引键

    KEY

    KEY

    7

    6字节哈希值

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

    分页

    PAGE

    PAG

    6

    文件编号:分页编号

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

    范围

    EXTENT

    EXT

    8

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

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

     

    HoBT

         

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

    数据表

    TABLE

    TAB

    5

    数据表ID(OBJID字段)

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

    文件

    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

    图如下示:

     

  • 相关阅读:
    linux(fedora) 下dvwa 建筑环境
    【ThinkingInC++】2、输入和输出流
    Caused by: java.lang.ClassNotFoundException: javax.transaction.TransactionManager
    SpringMVC注释启用
    XML wsdl soap xslt xsl ide
    一个解析RTSP 的URL函数
    PHP:header()函数
    jquery实现鼠标焦点十字效果
    拼出漂亮的表格
    Oracle中如何插入特殊字符:& 和 ' (多种解决方案)
  • 原文地址:https://www.cnblogs.com/Yongzhouunknown/p/4760765.html
Copyright © 2011-2022 走看看