博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)
阅读量:5338 次
发布时间:2019-06-15

本文共 1843 字,大约阅读时间需要 6 分钟。

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

 

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

 

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

名称

资源

缩写

编码

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

说明

数据行

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')begindrop table #tempcreate table #temp(spid int,dbid int ,objid int,indid int,type varchar(3),resource varchar(20),mode varchar(20),status varchar(5))endbegin tranupdate WBK_PDE_head set [COP_EMS_NO]='abcde' where wbook_no='BE404942850177'insert #temp exec sp_lock @@spidcommit tran -----获取dbid--select DB_ID('Test')--只查看定制的数据库的相关资源,sql 2008select 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=28order 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=28order 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

 

图如下示:

 

 

转载于:https://www.cnblogs.com/littlewrong/p/9025750.html

你可能感兴趣的文章
微软面试4、在二元树中找出和为某一值的所有路径
查看>>
link with editor
查看>>
js 获取字符串中所有的数字和汉字
查看>>
vue-cli中配置sass
查看>>
EhCache缓存
查看>>
art-template引擎模板
查看>>
Using Emacs as Clojure IDE
查看>>
unity3d 和sharesdk 进行登录分享使用过程(引用)
查看>>
如何使用USBWebserver在本机快速建立网站测试环境
查看>>
002-ES6Class和普通构造函数的区别
查看>>
python批量检测注入点脚本
查看>>
Light oj 1043(数学)
查看>>
SSM事务——事务回滚如何拿到返回值
查看>>
辞旧迎新,如何区分新旧控件:除了遍历就是创建全局变量,设置默认值,在迎新后,将新的值赋给全局变量.像接力棒一样....
查看>>
淘宝首页交互2--搜索框切换
查看>>
wcf session开启
查看>>
【转】使用C#通过Oracle.DataAccess连接Oracle,部署时需要注意版本问题
查看>>
CF1146G Zoning Restrictions
查看>>
JSP的登陆验证
查看>>
正则表达式之密码效验(检验密码是含有小写字母、大写字母、数字、特殊符号的两种及以上)...
查看>>