http://www.douzhe.com/docs/jh/21/9547.html1. 使用sp_lock进行察看,如果 输出信息 locktype 中包含 -blk 字符,说明当前表 table_id 的 page 上的锁对其他进程造成了阻塞 
2. 通过察看 master..syslocks 系统表 
例 
id          dbid   page        type   spid   class                          fid    context row    loid 
----------- ------ ----------- ------ ------ ------------------------------ ------ ------- ------ ----------- 
  512004855      6           0      3     13 Non Cursor Lock                     0       0      0          26 
  512004855      6           0      4     12 Non Cursor Lock                     0       0      0          24 
  512004855      6           0      3     10 Non Cursor Lock                     0       0      0          20 
  512004855      6         793    261     13 Non Cursor Lock                     0       8      0          26 从spid可知道当前阻塞及被阻塞的进程,并且从type字段可以知道锁的类型,见下表: 
1 0x1 排它表锁 
2 0x2 共享表锁 
3 0x3 排它意图锁 
4 0x4 共享意图锁 
5 0x5 排它页锁 
6 0x6 共享页锁 
7 0x7 更新页锁 
8 0x8 排它行锁 
9 0x9 共享行锁 
10 0xA 更新行锁 
11 0xB 共享下一键锁 
256 0x100 锁在阻塞另一个进程 
512 0x200 请求锁 所以你可以通过下面的查询获得阻塞表信息 
select b.name as dbname,a.id as table_id,page,spid from syslocks a,sysdatabases b 
where b.dbid = a.dbid 
and a.type & 256 = 256 
 

解决方案 »

  1.   

    通过SP_LOCK返回当前所有的锁信息,根据type为'TAB'的objID与 sysobjects 表关联,可以得到表名。
      

  2.   

    select * from master.dbo.syslockinfo
      

  3.   

    通过SP_LOCK返回当前所有的锁信息,根据type为'TAB'的objID 。然后 select object_id(objID)
      

  4.   

    --查看锁信息
    create table #t(req_spid int,obj_name sysname)declare @s nvarchar(4000)
    ,@rid int,@dbname sysname,@id int,@objname sysnamedeclare 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 #t values(@rid,@objname)
    fetch next from tb into @rid,@dbname,@id
    end
    close tb
    deallocate tbselect 进程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 #t b on a.req_spid=b.req_spidgo
    drop table #t