sp_lock (Transact-SQL)

适用范围:SQL Server

报告有关锁的信息。

重要

在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 若要获取有关 SQL Server 数据库引擎中的锁的信息,请使用sys.dm_tran_locks动态管理视图。

Transact-SQL 语法约定

语法

sp_lock
    [ [ @spid1 = ] spid1 ]
    [ , [ @spid2 = ] spid2 ]
[ ; ]

参数

[ @spid1 = ] spid1

用户希望从sys.dm_exec_sessions中获取锁定信息的数据库引擎会话 ID 号。 @spid1为 int,默认值为 NULL. 执行 sp_who 以获取有关会话的进程信息。 如果未 指定@spid1 ,则会显示所有锁的相关信息。

[ @spid2 = ] spid2

另一个数据库引擎会话 ID 编号sys.dm_exec_sessions可能同时具有锁@spid1以及用户还需要的信息。 @spid2为 int,默认值为 NULL.

返回代码值

0 (成功)。

结果集

sp_lock结果集包含@spid1和@spid2参数中指定的会话所持有的每个锁的一行。 如果未指定@spid1@spid2,则结果集将报告当前在数据库引擎实例中处于活动状态的所有会话的锁。

列名称 数据类型 描述
spid smallint 请求锁定的进程数据库引擎会话 ID 号。
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 树 (HoBT)。 此信息在 SQL Server 中不完整。
AU = 锁定分配单元。 此信息在 SQL Server 中不完整。
Resource nchar(32) 标识被锁定资源的值。 值的格式取决于列中标识 Type 的资源类型:

Type 值: Resource
RID:格式 fileid:pagenumber:rid的标识符,其中 fileid 标识包含页面的文件, pagenumber 标识包含该行的页面,并 rid 标识页面上的特定行。 fileid 匹配 file_id 目录视图中的 sys.database_files 列。
KEY:由数据库引擎内部使用的十六进制数。
PAG:格式 fileid:pagenumber的数字,其中 fileid 标识包含页面的文件,并 pagenumber 标识页面。
EXT:标识盘区中第一页的数字。 数字采用格式 fileid:pagenumber
TAB:由于该表已在列中标识, ObjId 因此未提供任何信息。
DB:由于该数据库已在列中标识, dbid 因此未提供任何信息。
FIL:与目录视图中的列sys.database_files匹配file_id的文件的标识符。
APP:被锁定的应用程序资源唯一的标识符。 采用格式 DbPrincipalId:<first two to 16 characters of the resource string><hashed value>
MD:因资源类型而异。 有关详细信息,请参阅sys.dm_tran_locks中的列的说明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:锁定被持有具有冲突模式的锁的另一个进程阻止。

注解

用户可以通过下列方式控制读取操作的锁定:

所有没有与会话相关联的分布式事务都是孤立事务。 数据库引擎为所有孤立分布式事务分配 SPID 值-2,这使得用户能够更轻松地识别阻塞分布式事务。 有关详细信息,请参阅 使用标记的事务以一致的方式恢复相关数据库。

权限

需要 VIEW SERVER STATE 权限。

示例

A. 列出所有锁

以下示例显示有关当前保存在数据库引擎实例中的所有锁的信息。

USE master;
GO
EXEC sp_lock;
GO

B. 列出来自单服务器进程的锁

以下示例显示进程 ID 53 的信息(其中包括锁信息)。

USE master;
GO
EXEC sp_lock 53;
GO