1. SQL数据库账号登录
-
双击 “SQL Server Managemant Studio”登录,如下图所示:
登录后,SQL Server Managemant Studio 如下图所示:
-
方法一 执行SQL脚本
1.1 选择“数据库”àrispacs à右键dbo.register表 à 编写表脚本为à SELECT到 à新查询编辑窗口 单击,如下图所示:
1.2 打开后执行如下SQL语句:
DECLARE @spid INT ,
@bl INT ,
@intTransactionCountOnEntry INT ,
@intRowcount INT ,
@intCountProperties INT ,
@intCounter INT
CREATE TABLE #tmp_lock_who
(
id INT IDENTITY(1, 1) ,
spid SMALLINT ,
bl SMALLINT
)
INSERT INTO #tmp_lock_who ( spid, bl )
SELECT 0, blocked
FROM ( SELECT *
FROM sys.sysprocesses
WHERE blocked > 0
) a
WHERE NOT EXISTS ( SELECT *
FROM ( SELECT *
FROM sys.sysprocesses
WHERE blocked > 0
) b
WHERE a.blocked = spid )
UNION
SELECT spid, blocked
FROM sys.sysprocesses
WHERE blocked > 0
-- 找到临时表的记录数
SELECT @intCountProperties = COUNT(*), @intCounter = 1
FROM #tmp_lock_who
IF @intCountProperties = 0
SELECT N'现在没有阻塞和死锁信息' AS message
-- 循环开始
WHILE @intCounter <= @intCountProperties
BEGIN
-- 取第一条记录
SELECT @spid = spid, @bl = bl
FROM #tmp_lock_who
WHERE Id = @intCounter
BEGIN
IF @spid = 0
SELECT N'引起数据库死锁的是: ' + CAST(@bl AS VARCHAR(10))
+ N'进程号,其执行的SQL语法如下'
ELSE
SELECT N'进程号SPID:' + CAST(@spid AS VARCHAR(10))
+ N'被进程号SPID:' + CAST(@bl AS VARCHAR(10)) N'阻塞,其当前进程执行的SQL语法如下'
DBCC INPUTBUFFER (@bl )
END
-- 循环指针下移
SET @intCounter = @intCounter + 1
END
DROP TABLE #tmp_lock_who
运行结果如下图所示:
1.3 如果没有死锁,message值为“现在没有阻塞和死锁信息“;如果有死锁,会显示具体引起阻塞的进程和被阻塞的进程信息,直接用命令 Kill spid(进程号)杀死引起死锁的进程。如上图。
如果有死锁,会显示具体引起阻塞的进程和被阻塞的进程信息,如下图。
首先鼠标右键拷贝SQL语句并把SQL语句保存下来。
然后用命令 Kill spid(进程号)杀死引起死锁的进程。
最后把拷贝的SQL语句提交给DBA。这一步很重要,DBA只有知道引起死锁的原因,才能从根源上解决问题,避免此类事件再次发生。

2. 方法二 任务管理器
2.1 选择”管理” à”活动监视器“ à”查看进程“ ,如下图所示:
2.2 点击打开”活动监视器“后,将页面底部”窗口滑动条“向右拖,找到”阻塞者“字段,如图:
2.3 “阻塞“值为“0“表示当前进程没有引起阻塞;如果 ”阻塞“ 值为”1“,表示当前进程引起阻塞,用命令: kill spid 杀掉进程。
3. 方法三 sp_lock
3.1 选择“数据库”àrispacs à右键dbo.register表 à 编写表脚本为à SELECT到 à新查询编辑窗口 单击,如下图所示:
3.2 去除里面的代码,输入命令: sp_lock,然后点击“执行”按钮,结果出来后在“字段Mode” 中找到值为 “X“,或”“IX的进程,如下图所示:
3.3 如果找到”Mode”值为“X“或”IX“的进程,使用命令:kill spid(这里换成具体的进程号) 杀掉。
4. 其他方法
当然还有很多方法查看死锁进程,比如:
4.1 sp_who
4.2 使用profiler捕获死锁
4.3 使用DBCC捕获死锁
4.4 使用 Service Broker Event Notification捕获死锁
4.5 ……….
处理死锁的方法很多,在此不一一列举。
建议使用脚本查询(方法一),能更快更有效的定位问题! 有兴趣的可以多研究,多和总部运维交流。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26435490/viewspace-1472710/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26435490/viewspace-1472710/