加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver 2005 查看和kill死鎖

发布时间:2020-12-12 14:41:13 所属栏目:MsSql教程 来源:网络整理
导读:由于最近数据库量和查询较为复杂,导致数据库死锁,但又不知道如何检查哪句死住了,于是网到以下方法 这时我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和SQL语句。SQL Server自带的系统存储过程sp_who和sp_lock也可以用来查找阻塞和死锁,但没

由于最近数据库量和查询较为复杂,导致数据库死锁,但又不知道如何检查哪句死住了,于是网到以下方法


这时我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和SQL语句。SQL Server自带的系统存储过程sp_who和sp_lock也可以用来查找阻塞和死锁,但没有这里介绍的方法好用。
use?master
go
create?procedure?sp_who_lock
asbegindeclare@spidint,@bl@intTransactionCountOnEntry ????????@intRowcount????@intCountProperties???@intCounter

table?#tmp_lock_who (
id?
?identity(1),
spid?
smallint bl?)

IF@@ERROR<>0RETURN@@ERRORinsertinto?#tmp_lock_who(spid,bl)?select??,blocked
???
from?(*?sysprocesses?where?blocked>?) a?
???
notexists(?) b?
???
?a.blocked=spid)
???
union?spid,blocked??

--?找到临时表的记录数
Count?#tmp_lock_who

if@intCountProperties='现在没有阻塞和死锁信息'?message

?循环开始while<=?取第一条记录?bl
?#tmp_lock_who??Id??
?
????????????
引起数据库死锁的是:?'+CASTASVARCHAR10))?进程号,其执行的SQL语法如下else
????????????
进程号SPID:))+阻塞,其当前进程执行的SQL语法如下DBCC?INPUTBUFFER (?)
end?循环指针下移setdropreturnend

杀死锁和进程

如何去手动的杀死进程和锁?最简单的办法,重新启动服务。但是这里要介绍一个存储过程,通过显式的调用,可以杀死进程和锁。
?dbo.sysobjects??id?object_id(N[dbo].[p_killspid])?andOBJECTPROPERTY(id,NIsProcedure)
[dbo].p_killspidGOproc?p_killspid
@dbnamevarchar200)????要关闭进程的数据库名?
????
@sqlnvarchar500)?
????
20)

????
?#tb?cursorfor
????????
?spid=cast(spid?))??master..sysprocesses??dbiddb_id)
????
open?#tb
????
fetchnext
????
@@fetch_status?
????????
exec(kill?)
????????
closedeallocate?#tb
用法??p_killspid?newdbpy'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读