资源描述:
《sqlserver的死锁及处理方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、【转】处理sqlserver的死锁--第一篇--检测死锁--如果发生死锁了,我们怎么去检测具体发生死锁的是哪条SQL语句或存储过程?--这时我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和SQL语句。SQLServer自带的系统存储过程sp_who和sp_lock也可以用来查找阻塞和死锁,但没有这里介绍的方法好用。 usemastergocreateproceduresp_who_lockasbegindeclare@spidint,@blint, @intTransactionCountOnEntry int,
2、 @intRowcount int, @intCountProperties int, @intCounter int createtable#tmp_lock_who( idintidentity(1,1), spidsmallint, blsmallint) IF@@ERROR<>0RETURN@@ERROR insertinto#tmp_lock_who(spid,bl)select 0,blocked from(select*fromsysprocesseswhere b
3、locked>0)a wherenotexists(select*from(select*fromsysprocesseswhere blocked>0)b wherea.blocked=spid) unionselectspid,blockedfromsysprocesseswhere blocked>0 IF@@ERROR<>0RETURN@@ERROR --找到临时表的记录数 select @intCountProperties=Count(*),@intCounter=1 from#tmp_lock_who I
4、F@@ERROR<>0RETURN@@ERROR if@intCountProperties=0 select'现在没有阻塞和死锁信息'asmessage--循环开始while@intCounter<=@intCountPropertiesbegin--取第一条记录 select @spid=spid,@bl=bl from#tmp_lock_whowhereId=@intCounter begin if@spid=0 select'引起数据库死锁的是:'+CAST(@blASVARCHAR(10))+'
5、进程号,其执行的SQL语法如下' else select'进程号SPID:'+CAST(@spidASVARCHAR(10))+'被'+'进程号SPID:'+CAST(@blASVARCHAR(10))+'阻塞,其当前进程执行的SQL语法如下' DBCCINPUTBUFFER(@bl) end--循环指针下移 set@intCounter=@intCounter+1enddroptable#tmp_lock_whoreturn0end --杀死锁和进程--如何去手动的杀死进程和锁?最简单的办法,重新启动服务
6、。但是这里要介绍一个存储过程,通过显式的调用,可以杀死进程和锁。usemastergoifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[p_killspid]')andOBJECTPROPERTY(id,N'IsProcedure')=1)dropprocedure[dbo].[p_killspid]GOcreateprocp_killspid@dbnamevarchar(200) --要关闭进程的数据库名as declare@sql nvarc
7、har(500) declare@spidnvarchar(20) declare#tbcursorfor selectspid=cast(spidasvarchar(20))frommaster..sysprocesseswheredbid=db_id(@dbname) open#tb fetchnextfrom#tbinto@spid while@@fetch_status=0 begin exec('kill'+@spid) fetchnextfrom#tb
8、into@spid end close#tb deallocate#tbgo--用法 execp_killspid 'newdbpy' --查看锁信息--如何查看系统中所有锁的详细信息?在企业管理管理器中,我们可以看到一些进程和锁的信息,这里介绍另外一种方法。-