首页 > 开发 > 综合 > 正文

避免资源死锁:识别已打开的事务

2024-07-21 02:12:44
字体:
来源:转载
供稿:网友

最大的网站源码资源下载站,

因为打开的事务可能会死锁资源,引发性能的问题,所以了解在一个专用数据库中哪些事务是打开的是很有帮助的。被死锁的资源可能堵塞其他数据库的用户。

为了找出这些已打开的事务就要查询master数据库中的sysprocesses表。sysprocesses表有一个open_tran的列,它表示已有命令是否是一个打开的事务。如果值大于0表示它是一个已经打开的事务。sysprocesses表还有一个spid的列,表示正在访问sql server的系统进程的id。你可以使用spid列作为dbcc inputbuffer()系统函数的参数。只有sql server的sysadmins帐号才可以执行这个函数。这个函数的输出首先是spid对应的255字符的命令。你可以由此确定哪个命令是影响数据库性能的罪魁祸首,然后根据spid发出一个kill命令。

下面是打印已打开事务的命令的脚本。它用到了表变量,因此只能在sql server 2000上用。

set nocount on
declare @commands
      table
      ( ctr int identity not null,
      command varchar(2000) not null)


insert @commands (command)
select 'dbcc inputbuffer (' + convert( varchar(10), spid) + ')'
from master..sysprocesses
where open_tran > 0


declare @ctr int, @command varchar(2000)
set @ctr = 1


while @ctr < (select count(*) + 1 from @commands)
begin
      select @command = command from @commands where ctr = @ctr
      print '-- ' + @command
      execute (@command)
      select @ctr = @ctr + 1
end

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表