注册 登录
编程论坛 SQL Server论坛

如何得到数据库中某张表的锁定状态?

随风逐流 发布于 2007-12-27 14:24, 1985 次点击
RT
9 回复
#2
随风逐流2007-12-29 12:32
没有人知道?
#3
purana2007-12-29 17:04
什么是锁定状态?
#4
随风逐流2008-01-02 16:56
....昏,不知道锁定状态?
所谓锁定状态我只知道一种
就是只有你的连接能够对那个表进行任何操作.
而其他连接只能对这个表进行SELECT.其他命令不行,要等待
#5
西风独自凉2008-01-02 18:46
SELECT * FROM table WITH (HOLDLOCK)
??其他事务可以读取表,但不能更新删除
??
??SELECT * FROM table WITH (TABLOCKX)
??其他事务不能读取表,更新和删除
#6
purana2008-01-02 18:47
--查看锁信息

exec   sp_who

----------------------------------------------
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

go
drop table #t
#7
随风逐流2008-01-02 19:12
原帖由 [bold][underline]西风独自凉[/underline][/bold] 于 2008-1-2 18:46 发表 [url=http://bbs.bc-cn.net/redirect.php?goto=findpost&pid=1168958&ptid=194623][/url]
SELECT * FROM table WITH (HOLDLOCK)
??其他事务可以读取表,但不能更新删除
??
??SELECT * FROM table WITH (TABLOCKX)
??其他事务不能读取表,更新和删除

这个方法不行.数据库里面上百万条记录.
你这个执行下要消耗太多时间
#8
随风逐流2008-01-02 19:15
谢谢,可以解决问题!!!!!!!!!!!!!!
#9
随风逐流2008-01-03 12:44
列rsc_indid里面的0和1是怎么个回事?
#10
随风逐流2008-01-03 13:09
2楼的不行啊
我测试了下,在事务里面用INSERT和UPDATE DELETE。
中断,用你给的SQL语句得到的信息差不多一样的。无法确定有没有锁定
1