sp_lock (Transact-SQL)
适用于:SQL Server
报告有关锁的信息。
重要
在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 若要获取有关 SQL Server 数据库引擎中的锁的信息,请使用sys.dm_tran_locks动态管理视图。
语法
sp_lock [ [ @spid1 = ] 'session ID1' ] [ , [@spid2 = ] 'session ID2' ]
[ ; ]
参数
[ @spid1 = ] 'session ID1'
用户想要锁定信息的sys.dm_exec_sessions数据库引擎会话 ID 号。 会话 ID1 为 int ,默认值为 NULL。 执行 sp_who 以获取有关会话的进程信息。 如果未 指定会话 ID1 ,则会显示有关所有锁的信息。
[ @spid2 = ] 'session ID2'
另一个数据库引擎会话 ID 编号来自sys.dm_exec_sessions,该号码可能与会话 ID1 同时具有锁,以及用户也希望获取哪些信息。 会话 ID2 为 int ,默认值为 NULL。
返回代码值
0(成功)
结果集
sp_lock结果集包含@spid1和@spid2参数中指定的会话所持有的每个锁的一行。 如果未指定@spid1或@spid2,则结果集将报告当前在数据库引擎实例中处于活动状态的所有会话的锁。
列名称 | 数据类型 | 描述 |
---|---|---|
spid | smallint | 请求锁定的进程数据库引擎会话 ID 号。 |
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 树 (HoBT)。 此信息在 SQL Server 中不完整。 AU = 分配单元的锁。 此信息在 SQL Server 中不完整。 |
资源 | nchar(32) | 标识被锁定资源的值。 值的格式取决于类型列中标识的资源类型: 类型 值: 资源 值 RID:格式为 fileid:pagenumber:rid 的标识符,其中 fileid 标识包含页的文件,pagenumber 标识包含行的页,rid 标识页上的特定行。 fileid 与sys.database_files目录视图中的file_id列匹配。 键:由数据库引擎内部使用的十六进制数。 PAG:格式为 fileid:pagenumber 的数字,其中 fileid 标识包含页的文件,pagenumber 标识页。 EXT:标识区中的第一页的数字。 该数字的格式为 fileid:pagenumber。 TAB:未提供任何信息,因为表已在 ObjId 列中标识。 DB:未提供任何信息,因为数据库已在 dbid 列中标识。 FIL:该文件的标识符,它与sys.database_files目录视图中的file_id列匹配。 APP:被锁定的应用程序资源的唯一标识符。 采用 DbPrincipalId:<资源字符串><哈希值>前两到 16 个字符的格式。 MD:随资源类型而变化。 有关详细信息,请参阅 sys.dm_tran_locks (Transact-SQL)中resource_description列的说明。 HBT:没有提供任何信息。 请改用 sys.dm_tran_locks 动态管理视图。 AU:没有提供任何信息。 请改用 sys.dm_tran_locks 动态管理视图。 |
模式 | 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)。
所有没有与会话相关联的分布式事务都是孤立事务。 数据库引擎为所有孤立分布式事务分配 SPID 值 -2,这使得用户更容易识别阻塞分布式事务。 有关详细信息,请参阅使用标记的事务一致地恢复相关的数据库(完整恢复模式)。
权限
需要 VIEW SERVER STATE 权限 。
示例
A. 列出所有锁
以下示例显示有关当前保存在数据库引擎实例中的所有锁的信息。
USE master;
GO
EXEC sp_lock;
GO
B. 列出单服务器进程的锁
以下示例显示进程 ID 53
的信息(其中包括锁信息)。
USE master;
GO
EXEC sp_lock 53;
GO
另请参阅
sys.dm_tran_locks (Transact-SQL)
DB_NAME (Transact-SQL)
KILL (Transact-SQL)
OBJECT_NAME (Transact-SQL)
sp_who (Transact-SQL)
sys.database_files (Transact-SQL)
sys.dm_os_tasks (Transact-SQL)
sys.dm_os_threads (Transact-SQL)
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈