sp_lock (Transact-SQL)

報告鎖定的相關資訊。

重要注意事項重要事項

未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。若要取得 SQL Server Database Engine 中之鎖定的相關資訊,請使用 sys.dm_tran_locks 動態管理檢視。

主題連結圖示Transact-SQL 語法慣例

語法

sp_lock [ [ @spid1 = ] 'session ID1' ] [ , [@spid2 = ] 'session ID2' ]
[ ; ]

引數

  • [ @spid1 = ] 'session ID1'
    這是 sys.dm_exec_sessions 中,使用者想要取得其鎖定資訊的 Database Engine 工作階段識別碼 (在 SQL Server 2000 和更早版本中稱為 SPID)。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

保留鎖定之索引的識別碼。

Type

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:持有模式衝突的鎖定之另一處理序會封鎖鎖定。

備註

使用者可以利用下列方式來控制讀取作業的鎖定:

如需有關 Database Engine 所用之鎖定類型的詳細資訊,請參閱<Database Engine 中的鎖定>。

所有未關聯於工作階段的分散式交易都是被遺棄的交易。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