2168575 发表于 2015-6-29 15:51:54

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

接上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 ='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的锁机制(一)——概述(锁的种类与范围)中的“示例代码二”相内容。
页: [1]
查看完整版本: SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)