接上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')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
圖如下示:
另外的樣本可以參見SQL SERVER的鎖機制(一)——概述(鎖的種類與範圍)中的“範例程式碼二”相內容。