由于最近数据库量和查询较为复杂,导致数据库死锁,但又不知道如何检查哪句死住了,于是网到以下方法
这时我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和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'
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|