sys.dm_tran_locks

返回有关当前活动的锁管理器资源的信息。向锁管理器发出的已授予锁或正等待授予锁的每个当前活动请求分别对应一行。

结果集中的列大体分为两组:资源组和请求组。资源组说明正在进行锁请求的资源,请求组说明锁请求。

列名 数据类型 说明

resource_type

nvarchar(120)

表示资源类型。该值可以是下列值之一:DATABASE、FILE、OBJECT、PAGE、KEY、EXTENT、RID、APPLICATION、METADATA、HOBT 或 ALLOCATION_UNIT。

resource_subtype

nvarchar(120)

表示 resource_type 的子类型。从技术角度而言,可以在未持有父类型的非子类型化锁的情况下获取子类型锁。不同的子类型之间以及与非子类型化的父类型之间都不会发生冲突。并非所有资源类型都有子类型。

resource_database_id

int

此资源位于其范围之内的数据库的 ID。由锁管理器处理的所有资源均按该数据库 ID 划分范围。

resource_description

nvarchar(512)

资源的说明,其中只包含从其他资源列中无法获取的信息。

resource_associated_entity_id

bigint

数据库中与资源相关联的实体的 ID。该值可以是对象 ID、Hobt ID 或分配单元 ID,具体视资源类型而定。

resource_lock_partition

int

已分区锁资源的锁分区 ID。对于未分区锁资源,该值为 0。

request_mode

nvarchar(120)

请求的模式。对于已授予的请求,为已授予模式;对于等待请求,为正在请求的模式。

request_type

nvarchar(120)

请求类型。该值为 LOCK。

request_status

nvarchar(120)

该请求的当前状态。可能值为 GRANTED、CONVERT 或 WAIT。

request_reference_count

smallint

返回同一请求程序已请求该资源的近似次数。

request_lifetime

int

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

request_session_id

int

当前拥有该请求的会话 ID。对于分布式事务和绑定事务,拥有请求的会话 ID 可能不同。该值为 -2 时,指示该请求属于孤立的分布式事务。该值为 -3 时,指示请求属于延迟的恢复事务,例如因其回滚未能成功完成而延迟恢复该回滚的事务。

request_exec_context_id

int

当前拥有该请求的进程的执行上下文 ID。

request_request_id

int

当前拥有该请求的进程的请求 ID(批处理 ID)。每当事务的多个活动的结果集 (MARS) 连接更改时,该值便会更改。

request_owner_type

nvarchar(120)

拥有请求的实体类型。锁管理器请求可由各种实体所拥有。可能的值有:

TRANSACTION = 请求由事务所有。

CURSOR = 请求由游标所有。

SESSION = 请求由用户会话所有。

SHARED_TRANSACTION_WORKSPACE = 请求由事务工作区的共享部分所有。

EXCLUSIVE_TRANSACTION_WORKSPACE = 请求由事务工作区的排他部分所有。

request_owner_id

bigint

请求的特定所有者 ID。该值仅用于将自己作为 ID 的事务。

request_owner_guid

uniqueidentifier

此请求的特定所有者的 GUID。该值仅供分布式事务使用,在该事务中,该值与事务的 MS DTC GUID 相对应。

request_owner_lockspace_id

nvarchar(64)

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。 该值表示请求程序的锁空间 ID。锁空间 ID 确定两个请求程序是否相互兼容以及在两者冲突的模式下是否可以向其授予锁。

lock_owner_address

varbinary(8)

用于跟踪该请求的内部数据结构的内存地址。该列可以与 sys.dm_os_waiting_tasks 中的 resource_address 列联接。

权限

需要对服务器具有 VIEW SERVER STATE 权限。

备注

已授予请求状态指示已将资源上的锁授予请求程序。等待请求指示尚未授予请求。request_status 列返回下列等待请求类型:

  • 转换请求状态指示已向请求程序授予对资源的请求,并且请求程序当前正在等待升级到要授予的初始请求。
  • 等待请求状态指示请求程序当前未持有对资源的已授予请求。

由于 sys.dm_tran_locks 从锁管理器的内部数据结构填充,因此维护该信息不会给常规处理带来额外的开销。具体化该视图需要访问锁管理器的内部数据结构。这可能会略微影响服务器中的常规处理。这些影响应该很难察觉,并且应该只会影响频繁使用的资源。由于该视图中的数据与活动的锁管理器状态相对应,因此该数据可能会随时更改,并且在获取和释放锁时会相应地添加和删除行。该视图不包含历史信息。

仅当所有资源组列都相等时,才对同一资源执行两个请求。

您可以使用下列工具控制读取操作的锁定:

使用一个会话 ID 运行的资源可以有多个已授予锁。在一个会话下运行的不同实体可以拥有同一资源的锁,并且相关信息显示在 sys.dm_tran_locks 所返回的 request_owner_typerequest_owner_id 列中。如果存在属于同一 request_owner_type 的多个实例,则使用 request_owner_id 列区分每个实例。对于分布式事务,request_owner_typerequest_owner_guid 列将显示不同的实体信息。

例如,会话 S1 拥有 Table1 的共享锁,而在会话 S1 下运行的事务 T1 也拥有 Table1 的共享锁。在这种情况下,sys.dm_tran_locks 所返回的 resource_description 列将显示同一资源的两个实例。request_owner_type 列将其中一个实例显示为会话,将另一个实例显示为事务。此外,resource_owner_id 列将具有不同的值。

ms190345.note(zh-cn,SQL.90).gif注意:
在一个会话下运行的多个游标无法区分,被视为一个实体。 有关 SQL Server 数据库引擎使用的锁类型的详细信息,请参阅数据库引擎中的锁定

与会话 ID 值没有关联的分布式事务是孤立事务,向该事务分配的会话 ID 值为 -2。有关详细信息,请参阅 KILL (Transact-SQL)

资源详细信息

下表列出了在 resource_associated_entity_id 列中表示的资源。

资源类型 资源说明 Resource_associated_entity_id

DATABASE

表示数据库。

不可用

FILE

表示数据库文件。此文件可以是数据文件,也可以是日志文件。

不适用

OBJECT

表示数据库对象。此对象可以是数据表、视图、存储过程、扩展存储过程或任何具有对象 ID 的对象。

对象 ID

PAGE

表示数据文件中的单页。

HoBt ID。该值与 sys.partitions.hobt_id 相对应。PAGE 资源并不总是有 HoBt ID,因为 HoBt ID 是可由调用方提供的额外信息,而有些调用方不能提供该信息。

KEY

表示索引中的一行。

HoBt ID。该值与 sys.partitions.hobt_id 相对应。

EXTENT

表示数据文件区。区是由八个连续页构成的组。

不适用

RID

表示堆中的物理行。

HoBt ID。该值与 sys.partitions.hobt_id 相对应。RID 资源并不总是有 HoBt ID,因为 HoBt ID 是可由调用方提供的额外信息,而有些调用方不能提供该信息。

APPLICATION

表示指定了应用程序的资源。

不可用

METADATA

表示元数据信息。

不适用

HOBT

表示堆或 B 树。它们是基本访问路径结构。

HoBt ID。该值与 sys.partitions.hobt_id 相对应。

ALLOCATION_UNIT

表示一组相关页,如索引分区。每个分配单元都包含一个索引分配映射 (IAM) 链。

分配单元 ID。该值与 sys.allocation_units.allocation_unit_id 相对应。

下表列出了与每个资源类型相关联的子类型。

ResourceSubType 同步

DATABASE.BULKOP_BACKUP_DB

数据库备份与大容量操作。

DATABASE.BULKOP_BACKUP_LOG

数据库日志备份与大容量操作。

DATABASE.DDL

数据定义语言 (DDL) 操作与文件组操作(如删除)。

DATABASE.STARTUP

用于数据库启动同步。

TABLE.UPDSTATS

表的统计信息更新。

TABLE.COMPILE

存储过程编译。

TABLE.INDEX_OPERATION

索引操作。

HOBT.INDEX_REORGANIZE

堆或索引重组操作。

HOBT.BULK_OPERATION

下列隔离级别下的优化堆大容量加载操作与并发扫描:快照、未提交读和使用行版本控制的已提交读。

ALLOCATION_UNIT.PAGE_COUNT

在延迟删除操作期间的分配单元页计数统计信息。

METADATA.INDEXSTATS

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.STATS

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.XML_COLLECTION

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SEQUENCE

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.QNAME

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ASSEMBLY_CLR_NAME

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ASSEMBLY_TOKEN

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ASSEMBLY

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.PARTITION_FUNCTION

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.DATA_SPACE

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.USER_TYPE

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.DB_PRINCIPAL_SID

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.DATABASE_PRINCIPAL

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SCHEMA

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.XML_COMPONENT

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SERVER

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.INSTANTIATED_TYPE_HASH

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.DB_MIRRORING_SESSION

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ENDPOINT

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SECURITY_CACHE

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.DB_MIRRORING_WITNESS

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.CREDENTIAL

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SECURITY_DESCRIPTOR

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SERVICE_BROKER_GUID

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.CONVERSTATION_ENDPOINT_RECV

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.DATABASE

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.CONVERSATION_GROUP

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ENDPOINT_WEBMETHOD

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ASSYMMETRIC_KEY

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.FULLTEXT_CATALOG

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.FULLTEXT_INDEX

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SERVER_PRINCIPAL

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ROUTE

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.MESSAGE

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.QNAME_HASH

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SERVICE_MESSAGE_TYPE

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.CONVERSTATION_ENDPOINT_SEND

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.CERTIFICATE

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SYMMETRIC_KEY

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.XML_INDEX_QNAME

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SERVICE_CONTRACT

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.REMOTE_SERVICE_BINDING

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SERVICE

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.METADATA_CACHE

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

下表提供每个资源类型的 resource_description 列的格式。

资源 Format 说明

DATABASE

不适用

resource_database_id 列中已提供数据库 ID。

FILE

<file_id>

此资源所表示的文件 ID。

OBJECT

<object_id>

此资源所表示的对象 ID。此对象可以是 sys.objects 中列出的任何对象,不仅仅是表。

PAGE

<file_id>:<page_in_file>

表示此资源所表示的页的文件和页 ID。

KEY

<hash_value>

表示行中由此资源表示的键列的哈希。

EXTENT

<file_id>:<page_in_files>

表示此资源所表示的区的文件和页 ID。区 ID 与区中的第一页的页 ID 相同。

RID

<file_id>:<page_in_file>:<row_on_page>

表示此资源所表示的行的页 ID 和行 ID。请注意,如果关联的对象 ID 为 99,则此资源表示 IAM 链的第一个 IAM 页上的八个混合页槽之一。

APPLICATION

<DbPrincipalId>:<upto 32 characters>:(<hash_value>)

表示用于划分此应用程序锁资源范围的数据库主体的 ID。还包含与此应用程序锁资源相对应的资源字符串,最多包含其中的 32 个字符。在某些情况下,因不再提供完整字符串而只能显示 2 个字符。只有在恢复过程中重新获取的应用程序锁处于数据库恢复期间才会发生此行为。哈希值表示与此应用程序锁资源相对应的完整资源字符串的哈希。

HOBT

不适用

作为 resource_associated_entity_id 提供的 HoBt ID。

ALLOCATION_UNIT

不适用

作为 resource_associated_entity_id 提供的分配单元 ID。

METADATA.SEQUENCE

$seq_type = S, object_id = O

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.STATS

object_id = O, stats_id = S

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SCHEMA

schema_id = S

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.INDEXSTATS

object_id = O, index_id or stats_id = I

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.DATABASE_PRINCIPAL

principal_id = P

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.DB_PRINCIPAL_SID

$hash = H1:H2:H3

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.USER_TYPE

user_type_id = U

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.DATA_SPACE

data_space_id = D

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.PARTITION_FUNCTION

function_id = F

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.PARTITION_FUNCTION

function_id = F

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ASSEMBLY

assembly_id = A

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ASSEMBLY_TOKEN

assembly_id = A, $token_id = T

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ASSEMBLY_CLR_NAME

$qname_id = Q

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.QNAME

$qname_id = Q

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.XML_COLLECTION

xml_collection_id = X

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.XML_COMPONENT

xml_component_id = X

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.QNAME_HASH

$qname_scope_id = Q, $qname_hash = H

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.XML_INDEX_QNAME

object_id = O, $qname_id = Q

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SERVICE_MESSAGE_TYPE

message_type_id = M

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SERVICE_CONTRACT

service_contract_id = S

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SERVICE

service_id = S

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.REMOTE_SERVICE_BINDING

remote_service_binding_id = R

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ROUTE

route_id = R

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.FULLTEXT_INDEX

object_id = O

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.FULLTEXT_CATALOG

fulltext_catalog_id = F

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.CONVERSATION_GROUP

conversation_group_id = C

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.CONVERSTATION_ENDPOINT_SEND

$hash = H1:H2:H3

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.CONVERSTATION_ENDPOINT_RECV

$hash = H1:H2:H3

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SYMMETRIC_KEY

symmetric_key_id = S

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.CERTIFICATE

certificate_id = C

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ASSYMMETRIC_KEY

asymmetric_key_id = A

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.DATABASE

database_id = D

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.MESSAGE

message_id = M

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SERVER_PRINCIPAL

principal_id = P

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SERVER

server_id = S

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ENDPOINT

endpoint_id = E

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.ENDPOINT_WEBMETHOD

$hash = H1:H2:H3

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.DB_MIRRORING_SESSION

database_id = D

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.DB_MIRRORING_WITNESS

$hash = H1:H2:H3

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SERVICE_BROKER_GUID

$hash = H1:H2:H3

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SERVICE_BROKER_GUID

$hash = H1:H2:H3

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.CREDENTIAL

credential_id = C

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.INSTANTIATED_TYPE_HASH

user_type_id = U, hash = H1

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SECURITY_DESCRIPTOR

sd_id = S

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.SECURITY_CACHE

$hash = H1:H2:H3

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

METADATA.METADATA_CACHE

$hash = H1:H2:H3

标识只是为了提供一些信息。不提供支持。不保证以后的兼容性。

示例

A. 将 sys.dm_tran_locks 与其他工具一起使用

以下代码示例处理更新操作被另一个事务阻塞的情况。使用 sys.dm_tran_locks 和其他工具,可提供有关锁定资源的信息。

USE tempdb;
GO

-- Create test table and index.
CREATE TABLE t_lock
    (
    c1 int, c2 int
    );
GO

CREATE INDEX t_lock_ci on t_lock(c1);
GO

-- Insert values into test table
INSERT INTO t_lock VALUES (1, 1);
INSERT INTO t_lock VALUES (2,2);
INSERT INTO t_lock VALUES (3,3);
INSERT INTO t_lock VALUES (4,4);
INSERT INTO t_lock VALUES (5,5);
INSERT INTO t_lock VALUES (6,6);
GO

-- Session 1
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

BEGIN TRAN
    SELECT c1
        FROM t_lock
        WITH(holdlock, rowlock);

-- Session 2
BEGIN TRAN
    UPDATE t_lock SET c1 = 10

下面的查询将显示锁信息。<dbid> 的值应该替换为 sys.databasesdatabase_id

SELECT resource_type, resource_associated_entity_id,
    request_status, request_mode,request_session_id,
    resource_description 
    FROM sys.dm_tran_locks
    WHERE resource_database_id = <dbid>

下面的查询使用前一个查询中的 resource_associated_entity_id 返回对象信息。必须在连接到包含此对象的数据库时执行此查询。

SELECT object_name(object_id), *
    FROM sys.partitions
    WHERE hobt_id=<resource_associated_entity_id>

下面的查询将显示阻塞信息。

SELECT 
        t1.resource_type,
        t1.resource_database_id,
        t1.resource_associated_entity_id,
        t1.request_mode,
        t1.request_session_id,
        t2.blocking_session_id
    FROM sys.dm_tran_locks as t1
    INNER JOIN sys.dm_os_waiting_tasks as t2
        ON t1.lock_owner_address = t2.resource_address;

通过回滚事务来释放资源。

-- Session 1
ROLLBACK;
GO

-- Session 2
ROLLBACK;
GO

B. 将会话信息链接到操作系统线程

下面的示例返回使会话 ID 与某一 Windows 线程 ID 相关联的信息。可以在 Windows 性能监视器中监视该线程的性能。该查询不返回当前正在休眠的会话 ID。

SELECT STasks.session_id, SThreads.os_thread_id
    FROM sys.dm_os_tasks AS STasks
    INNER JOIN sys.dm_os_threads AS SThreads
        ON STasks.worker_address = SThreads.worker_address
    WHERE STasks.session_id IS NOT NULL
    ORDER BY STasks.session_id;
GO

请参阅

参考

sys.dm_tran_database_transactions
动态管理视图和函数
与事务有关的动态管理视图和函数

帮助和信息

获取 SQL Server 2005 帮助