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

ZDNet软件频道 时间:2003-05-14 作者:翻译:Java研究组织barney |  我要评论()
本文关键词:sqltips
因为打开的事务可能会死锁资源,引发性能的问题,所以了解在一个专用数据库中哪些事务是打开的是很有帮助的。
本文译自Builder.com,未经许可请勿转载因为打开的事务可能会死锁资源,引发性能的问题,所以了解在一个专用数据库中哪些事务是打开的是很有帮助的。被死锁的资源可能堵塞其他数据库的用户。

为了找出这些已打开的事务就要查询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



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134