接上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
圖如下示: