锁-学习笔记(二)
如何查看锁的信息
主要使用的工具:
一、sys.dm_tran_locks动态管理视图来查询锁的情况,得到的结果是当前所有锁的一个快照,包含处于WAIT和CONVERT状态的锁的信息。
二、SQL Profiler,可以显示所有当前已经获得的锁的信息,但不能显示尚未获得的、处于WAIT和CONVERT状态的锁的信息。SQL Profiler对分析操作完成即释放的锁,如查询操作附加的共享锁或分配空间时附加的区锁,非常有用。因为这种锁不会保持到事务结束,使用动态管理视图sys.dm_tran_locks很难捕捉,只能使用SQL Profiler跟踪其产生及释放的过程。
CONVERT状态指在要转换某个资源上的锁模式时与资源上现有的锁不兼容,而发生等待的情况,也可称为等待转换。
使用sys.dm_tran_locks动态管理视图
使用sys.dm_tran_locks动态管理视图查询锁的情况时,可以使用以下代码创建视图dbLocks来帮助查询,代码中使用cast函数对相关列的长度进行了改变,是为了使查询结构的版面清晰。
if object_id('dbLocks') is not null drop view dbLocks
go
create view dbLocks
as
select cast(request_session_id as varchar(4)) as spid,
case when resource_type='OBJECT' then
cast(object_name(resource_associated_entity_id) as varchar(10))
when resource_associated_entity_id=0 then 'n/a'
else cast(object_name(p.object_id) as varchar(10))
end as ety_name,
index_id,
cast(resource_type as varchar(8)) as ety_type,
cast(resource_description as varchar(15)) as description,
cast(request_mode as varchar(8)) as mode,
cast(request_status as varchar(8)) as status
from sys.dm_tran_locks t left join sys.partitions p
on p.hobt_id=t.resource_associated_entity_id
where resource_database_id=db_id()
and object_id('dbLocks')!=resource_associated_entity_id
| 列名 | 含义 | 说明 |
| spid | 会话ID编号 | 可以查询@@spid返回当前连接的spid |
| ety_name | 锁定资源所属对象名称 | 主要是数据页、索引键所属表名 |
| index_id | 索引编号 | 0表示表,1表示聚集索引,其他值表示非聚集索引 |
| ety_type | 锁定资源的类型 | 其值主要包括DATABASE、FILE、EXTENT、OBJECT、PAGE、RID、KEY等 |
| description | 锁定资源的描述 | 对EXTENT PAGE RID KEY的描述,如EXTENT表示它的起始页页号及其所属文件号 |
| mode | 锁模式 | IS S IX X IU U等模式 |
| status | 锁的状态 | GRANT 获得 WAIT 等待 CONVERT 等待转换 3种状态 |
使用SQL Profiler工具查询锁的信息
使用SQL Profiler跟踪锁的情况,可以专门创建一个模板,命名为Locks,设置其模板属性时,选择Locks及Scans两个事件类。在Locks类中选择Lock:Acquired Lock:Released Lock:Escalation事件,Scans类中选择Scan:Started Scan:Stopped事件。

点击组织列将Mode ObjectID SPID TYPE TextData列上移,显示在事件列的最前端以方便查看,使用SQL Profiler工具查看锁的信息时,就可以选择此处创建的Locks跟踪模板.


浙公网安备 33010602011771号