sp_lock (Transact-SQL)
報告鎖定的相關資訊。
重要事項 |
---|
未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。若要取得 SQL Server Database Engine 中之鎖定的相關資訊,請使用 sys.dm_tran_locks 動態管理檢視。 |
適用於:SQL Server (SQL Server 2008 至目前版本)。 |
語法
sp_lock [ [ @spid1 = ] 'session ID1' ] [ , [@spid2 = ] 'session ID2' ]
[ ; ]
引數
[ @spid1 = ] 'session ID1'
這是 sys.dm_exec_sessions 中,使用者想要取得其鎖定資訊的 Database Engine 工作階段識別碼。 session ID1 是 int 預設值為 NULL。 請執行 sp_who 來取得該工作階段的處理序相關資訊。 如果未指定 session ID1,就會顯示所有鎖定的相關資訊。[ @spid2 = ] 'session ID2'
這是在 sys.dm_exec_sessions 中,可能與 session ID1 同時擁有鎖定,且使用者也需要其相關資訊的另一個 Database Engine 工作階段識別碼。 session ID2 是 int 預設值為 NULL。
傳回碼值
0 (成功)
結果集
sp_lock 結果集會針對 @spid1 和 @spid2 參數中指定的工作階段所保留的每個鎖定,各包含一個資料列。 如果既未指定 @spid1,也未指定 @spid2,結果集會報告在 Database Engine 的執行個體中,目前在使用中之所有工作階段的鎖定。
資料行名稱 |
資料類型 |
說明 |
---|---|---|
spid |
smallint |
要求鎖定之處理序的 Database Engine 工作階段識別碼。 |
dbid |
smallint |
保留鎖定之資料庫的識別碼。 您可以利用 DB_NAME() 函數來識別資料庫。 |
ObjId |
int |
保留鎖定之物件的識別碼。 您可以在相關資料庫中,利用 OBJECT_NAME() 函數來識別物件。 99 這個值是一個特殊情況,表示用來記錄資料庫頁面配置之某系統頁面的鎖定。 |
IndId |
smallint |
保留鎖定之索引的識別碼。 |
型別 |
nchar(4) |
鎖定類型: RID = 鎖定資料表中資料列識別碼 (RID) 所識別的單一資料列。 KEY = 在索引內鎖定,用來保護可序列化交易中的某個索引鍵範圍。 PAG = 鎖定資料或索引頁面。 EXT = 鎖定範圍。 TAB = 鎖定整份資料表,其中包括所有資料和索引。 DB = 鎖定資料庫。 FIL = 鎖定資料庫檔案。 APP = 鎖定應用程式指定資源。 MD = 鎖定中繼資料或目錄資訊。 HBT = 鎖定堆積或 B 型樹狀目錄索引。 SQL Server 中的這項資訊並不完整。 AU = 鎖定配置單位。 SQL Server 中的這項資訊並不完整。 |
Resource |
nchar(32) |
用來識別鎖定資源的值。 這個值的格式會隨著 Type 資料行所識別之資源類型而不同: Type 值:Resource 值 RID:格式為 fileid:pagenumber:rid 的識別碼,fileid 用來識別包含頁面的檔案,pagenumber 用來識別包含資料列的頁面,rid 用來識別頁面的特定資料列。 fileid 符合 sys.database_files 目錄檢視中的 file_id 資料行。 KEY:Database Engine 在內部使用的十六進位號碼。 PAG:格式為 fileid:pagenumber 的號碼,其中 fileid 用來識別包含頁面的檔案,pagenumber 用來識別頁面。 EXT:用來識別範圍內第一頁的號碼。 這個號碼的格式為 fileid:pagenumber。 TAB:無資訊,因為已在 ObjId 資料行中識別資料表。 DB:無資訊,因為已在 dbid 資料行中識別資料庫。 FIL:檔案的識別碼,它符合 sys.database_files 目錄檢視中的 file_id 資料行。 APP:鎖定之應用程式資源的專屬識別碼。 格式如下:DbPrincipleId:<資源字串的前兩個至 16 個字元><雜湊值>。 MD:隨資源類型而不同。 如需詳細資訊,請參閱<sys.dm_tran_locks (Transact-SQL)>中之 resource_description 資料行的描述。 HBT:未提供任何資訊。 請改用 sys.dm_tran_locks 動態管理檢視。 AU:未提供任何資訊。 請改用 sys.dm_tran_locks 動態管理檢視。 |
Mode |
nvarchar(8) |
要求的鎖定模式。 它有下列幾種: NULL = 未授與資源的任何存取權。 這用來作為預留位置。 Sch-S = 結構描述穩定性。 確定在任何工作階段持有結構描述元素的結構描述穩定性鎖定時,不卸除結構描述元素,如資料表或索引。 Sch-M = 結構描述修改。 想要變更指定資源結構描述的任何工作階段都必須持有這個項目。 請確定沒有其他工作階段在參考指示的物件。 S = 共用。 持有它的工作階段,會取得資源的共用存取權。 U = 更新。 表示取得最終可能會更新之資源的更新鎖定。 它用來防止當多個工作階段為了後來可能更新資源而鎖定資源時,所常見的死結形式。 X = 獨佔。 持有它的工作階段,會取得資源的獨佔存取權。 IS = 意圖共用。 表示在鎖定階層中的某些從屬資源上設定 S 鎖定的意圖。 IU = 意圖更新。 表示在鎖定階層中的某些從屬資源上設定 U 鎖定的意圖。 IX = 意圖獨佔。 表示在鎖定階層中的某些從屬資源上設定 X 鎖定的意圖。 SIU = 共用意圖更新。 表示意圖取得鎖定階層中從屬資源的更新鎖定之共用資源存取權。 SIX = 共用意圖獨佔。 表示意圖取得鎖定階層中從屬資源的獨佔鎖定之共用資源存取權。 UIX = 更新意圖獨佔。 表示意圖取得鎖定階層中從屬資源的獨佔鎖定之資源更新鎖定。 BU = 大量更新。 供大量作業使用。 RangeS_S = 共用索引鍵範圍和共用資源鎖定。 指出可序列化的範圍掃描。 RangeS_U = 共用索引鍵範圍和更新資源鎖定。 指出可序列化的更新掃描。 RangeI_N = 插入索引鍵範圍和 Null 資源鎖定。 在將新索引鍵插入索引之前,用來測試範圍。 RangeI_S = 索引鍵範圍轉換鎖定。 這是重疊 RangeI_N 和 S 鎖定所建立。 RangeI_U = 重疊 RangeI_N 和 U 鎖定而建立的索引鍵範圍轉換鎖定。 RangeI_X = 重疊 RangeI_N 和 X 鎖定而建立的索引鍵範圍轉換鎖定。 RangeX_S = 重疊 RangeI_N 和 RangeS_S 鎖定建立的索引鍵範圍轉換鎖定。 。 RangeX_U = 重疊 RangeI_N 和 RangeS_U 鎖定而建立的索引鍵範圍轉換鎖定。 RangeX_X = 獨佔索引鍵範圍和獨佔資源鎖定。 這是更新範圍中的索引鍵時所用的轉換鎖定。 |
Status |
nvarchar(5) |
鎖定要求狀態: CNVRT:正在從另一個模式轉換鎖定,但持有模式衝突的鎖定之另一處理序會封鎖轉換。 GRANT:已取得鎖定。 WAIT:持有模式衝突的鎖定之另一處理序會封鎖鎖定。 |
備註
使用者可以利用下列方式來控制讀取作業的鎖定:
利用 SET TRANSACTION ISOLATION LEVEL 來指定工作階段的鎖定層級。 關於語法和限制,請參閱<SET TRANSACTION ISOLATION LEVEL (Transact-SQL)>。
利用鎖定資料表提示,在 FROM 子句中指定資料表之個別參考的鎖定層級。 關於語法和限制,請參閱<資料表提示 (Transact-SQL)>。
所有未關聯於工作階段的分散式交易都是被遺棄的交易。 Database Engine 會指派 -2 的 SPID 值給所有被遺棄的分散式交易,讓使用者更容易識別封鎖的分散式交易。 如需詳細資訊,請參閱<使用標示的異動以一致的方式復原相關資料庫 (完整復原模式)>。
權限
需要 VIEW SERVER STATE 權限。
範例
A.列出所有鎖定
下列範例會顯示 Database Engine 的執行個體目前保留之所有鎖定的相關資訊。
USE master;
GO
EXEC sp_lock;
GO
B.列出單一伺服器處理序的鎖定
下列範例會顯示處理序識別碼 53 的相關資訊,其中包括鎖定。
USE master;
GO
EXEC sp_lock 53;
GO
請參閱
參考
sys.dm_tran_locks (Transact-SQL)
sys.database_files (Transact-SQL)