关于锁的疑问,为什么spid有0
现象:今天数据库出现故障,有一个表好像是被锁住了,无法更新表的内容
分析过程:到网上查原因,初步确定是锁的问题,用sp_lock和网上的语句查询
----------------------------网上查看锁的语句------------------------------
create table #t(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 #t 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 #t b on a.req_spid=b.req_spid
where db_name(rsc_dbid)='DCentreCHQ'
go
drop table #t
----------------------------网上查看锁的语句------------------------------
找到了原因,该表被RANGES-S锁锁死了,但是我的疑问是用sp_lock查出来的spid居然都是0,UOW的guid值也为0,0不是正常的spid,无法kill,因而无法把这个锁释放,请高手帮我解释下
1.sp_lock显示的spid为0是什么意思!
2.如果碰到这种情况我怎么才能释放这个锁呢!
3.还有我直接查询master..syslockinfo找到锁对应的transactionID,我可以通过transactionID回滚这个事务并释放锁吗?可以的话 什么命令呢?
请大家帮帮忙,这里先谢过了,分不够的话可以再给!