如果发生了死锁,如何才能查出引起死锁的进程和SQL语句?我们可以建立存储过程来检测,下面就将为您介绍该存储过程,供您参考,
使用存储过程,可以检测是哪些SQL语句及进程造成死锁,下面就将为您介绍该存储过程,供您参考,希望对您学习SQL有所帮助。
假如发生了死锁,我们怎么去检测具体发生死锁的是哪条SQL语句或存储过程?此时我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和SQL语句。
usemaster go createproceduresp_who_lock as begin declare@spidint,@blint, @intTransactionCountOnEntryint, @intRowcountint, @intCountPropertiesint, @intCounterint createtable#tmp_lock_who( idintidentity(1,1), spidsmallint, blsmallint) IF@@ERROR<>0RETURN@@ERROR insertinto#tmp_lock_who(spid,bl)select0,blocked from(select*fromsysprocesseswhereblocked>0)a wherenotexists(select*from (select*fromsysprocesseswhereblocked>0)b wherea.blocked=spid) unionselectspid,blockedfromsysprocesseswhereblocked>0 IF@@ERROR<>0RETURN@@ERROR –找到临时表的记录数 select@intCountProperties=Count(*),@intCounter=1 from#tmp_lock_who IF@@ERROR<>0RETURN@@ERROR if@intCountProperties=0 select’现在没有阻塞和死锁信息’asmessage –循环开始 while@intCounter<=@intCountProperties begin –取***条记录 select@spid=spid,@bl=bl from#tmp_lock_whowhereId=@intCounter begin if@spid=0 select’引起数据库死锁的是:’+CAST(@blASVARCHAR(10)) +’进程号,其执行的SQL语法如下’ else select’进程号SPID:’+CAST(@spidASVARCHAR(10))+’被’ +’进程号SPID:’+CAST(@blASVARCHAR(10))+’阻塞,其当 前进程执行的SQL语法如下’DBCCINPUTBUFFER |
【编辑推荐】
SQL语句中CASE WHEN的使用实例
教您不带参数的SQL语句执行的方法
巧用GO将多次重复执行SQL语句
SQL中INSERT语句的使用技巧
SQL语句中output的用法
转载请说明出处
知优网 » 使用存储过程检查引起死锁的SQL语句及进程(sql死锁的原因及解决方法)
知优网 » 使用存储过程检查引起死锁的SQL语句及进程(sql死锁的原因及解决方法)