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

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

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

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

BEGIN

SELECT @command = command FROM @Commands WHERE ctr = @ctr

PRINT '-- ' + @command

EXECUTE (@command)

SELECT @ctr = @ctr + 1

END

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航