二、完整的锁兼容性矩阵(见下图)
对上图的是代码说明:见下图。
三、下表列出了数据库引擎可以锁定的资源。
名称 | 资源 | 缩写 | 编码 | 呈现锁定时,描述该资源的方式 | 说明 |
数据行 | 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
图如下示: