如果数据库中出现数据被锁的问题后,对应的数据就无法再操作了,那么我们要怎么查看数据库中的锁信息,以找出对应的解决方法呢?
方法一:在microsoft sql server management studio中打开"管理"->"sql server日志"中查看日志信息
方法二:利用
系统表syslockinfo查看锁信息。
查看SQL语句如下:
--查看数据库中锁信息
create table #tableable(req_spid int,obj_name sysname)
declare @s nvarchar(4000),
@rid int,@dbname sysname,
@id int,@objname sysname
declare tb cursor for
select distinct req_spid,dbname=db_name(rsc_dbid),rsc_objid
from master..syslockinfo where rsc_type in(4,5)
open tb
fetch next from tb into @rid,@dbname,@id
while @@fetch_status=0
begin
set @s='select @objname=name from ['+@dbname+']..sysobjects where id=@id'
exec sp_executesql @s,N'@objname sysname out,@id int',@objname out,@id
insert into #table values(@rid,@objname)
fetch next from tb into @rid,@dbname,@id
end
close tb
deallocate tb
select 进程id=a.req_spid,
数据库=db_name(rsc_dbid),
资源类型=case rsc_type
when 1 then 'NULL 资源(未使用)'
when 2 then '数据库'
when 3 then '文件'
when 4 then '索引'
when 5 then '表'
when 6 then '页'
when 7 then '键'
when 8 then '扩展盘区'
when 9 then 'RID(行 ID)'
when 10 then '应用程序'
end
,对象id=rsc_objid
,对象名=b.obj_name
,rsc_indid
from master..syslockinfo a left join #tableable b on a.req_spid=b.req_spid
go
drop table #tableable
大家可以修改上面的SQL语句,以查询出自己所需的信息。
下面是对
系统表syslockinfo中列的解释:
列名 |
说明 |
rsc_text |
锁资源的文本化描述。包含资源名称的一部分。 |
rsc_bin |
二进制锁资源。包含锁管理器中所含的实际锁资源。对那些了解锁资源格式的工具包含该列,这些工具可生成自己的格式化锁资源并在 syslockinfo 上执行自联接。 |
rsc_valblk |
锁值块。有些资源类型可以在特定的锁资源中包含附加数据,锁管理器不对这类锁资源进行哈希运算以决定具体某个锁资源的所有关系。例如,页锁不归具体的对象 ID 所有。但是,对于锁升级和出于其他目的,页锁的对象 ID 可以包括在锁值块中。 |
rsc_dbid |
与资源关联的数据库 ID。 |
rsc_indid |
与资源关联的索引 ID(如果适合)。 |
rsc_objid |
与资源关联的对象 ID(如果适合)。 |
rsc_type |
资源类型:
1 = NULL 资源(未使用)
2 = 数据库
3 = 文件
4 = 索引
5 = 表
6 = 页
7 = 键
8 = 区
9 = RID(行 ID)
10 = 应用程序 |
rsc_flag |
内部资源标志。 |
req_mode |
锁请求模式。该列是请求者的锁模式,并且代表已授权模式,或代表转换或等待模式。
0 = NULL。不授权访问资源。用作占位符。
1 = Sch-S(架构稳定性)。确保在任何会话持有对架构元素(例如表或索引)的架构稳定性锁时,不删除该架构元素。
2 = Sch-S(架构修改)。必须由要更改指定资源架构的任何会话持有。确保没有其他会话正在引用所指示的对象。
3 = S(共享)。授予持有锁的会话对资源的共享访问权限。
4 = U(更新)。指示对最终可能更新的资源获取的更新锁。用于防止常见形式的死锁,这类死锁在多个会话锁定资源并且稍后可能更新资源时发生。
5 = X(排他)。授予持有锁的会话对资源的独占访问权限。
6 = IS(意向共享)。指示有意将 S 锁放置在锁层次结构中的某个从属资源上。
7 = IU(意向更新)。指示有意将 U 锁放置在锁层次结构中的某个从属资源上。
8 = IX(意向排他)。指示有意将 X 锁放置在锁层次结构中的某个从属资源上。
9 = IU(共享意向更新)。指示对有意在锁层次结构中的从属资源上获取更新锁的资源进行共享访问。
10 = IX(共享意向排他)。指示对有意在锁层次结构中的从属资源上获取排他锁的资源进行共享访问。
11 = IX(更新意向排他)。指示对有意在锁层次结构中的从属资源上获取排他锁的资源持有的更新锁。
12 = BU。由大容量操作使用。
13 = RangeS_S(共享键范围和共享资源锁)。指示可串行范围扫描。
14 = RangeS_U(共享键范围和更新资源锁)。指示可串行更新扫描。
5 = RangeI_N(插入键范围和空资源锁)。用于在将新键插入索引前测试范围。
16 = RangeI_S。通过 RangeI_N 和 S 锁的重叠创建的键范围转换锁。
17 = RangeI_U。通过 RangeI_N 和 U 锁的重叠创建的键范围转换锁。
18 = RangeI_X。通过 RangeI_N 和 X 锁的重叠创建的键范围转换锁。
19 = RangeX_S。通过 RangeI_N 和 RangeS_S 锁的重叠创建的键范围转换锁。
20 = RangeX_U。通过 RangeI_N 和 RangeS_U 锁的重叠创建的键范围转换锁。
21 = RangeX_X(排他键范围和排他资源锁)。这是在更新范围中的键时使用的转换锁。 |
req_status |
锁请求的状态:
1 = 已授予
2 = 正在转换
3 = 正在等待 |
req_refcnt |
锁引用计数。事务每次请求具体某个资源上的锁时,引用计数便会增加。直到引用计数等于 0 时才能释放锁。 |
req_cryrefcnt |
保留以供将来使用。总是设置为 0。 |
req_lifetime |
锁生存期位图。在某些查询处理策略的过程中,必须维护资源上的锁,直到查询处理器已完成查询的某个具体阶段为止。查询处理器和事务管理器用锁生存期位图指示在查询结束运行的某个阶段时可以释放的锁组。位图内的某些位用于指示即使锁的引用计数等于 0,也必须到事务结束时才释放的锁。 |
req_spid |
请求锁的会话的内部 Microsoft SQL Server Database Engine?进程 ID。 |
req_ecid |
执行上下文 ID (ECID)。用于指示并行操作内拥有具体某个锁的线程。 |
req_ownertype |
与锁关联的对象类型:
1 = 事务
2 = 游标
3 = 会话
4 = ExSession
注意,3 和 4 代表会话锁的特殊版本,分别跟踪数据库锁和文件组锁。 |
req_transactionID |
用于 syslockinfo 和事件探查器事件中的唯一事务 ID。 |
req_transactionUOW |
标识 DTC 事务的工作单元 ID (UOW)。对于非 MS DTC 事务,UOW 设置为 0。 |
注意:在SQL 2005及以上的版本中,推荐用sys.dm_tran_locks来代替syslockinfo系统表。