如果发生了死锁,如何才能查出引起死锁的进程和SQL语句?我们可以建立存储过程来检测,下面就将为您介绍该存储过程,供您参考,

使用存储过程,可以检测是哪些SQL语句及进程造成死锁,下面就将为您介绍该存储过程,供您参考,希望对您学习SQL有所帮助。

使用存储过程检查引起死锁的SQL语句及进程(sql死锁的原因及解决方法)  SQL 语句 存储过程 第1张

假如发生了死锁,我们怎么去检测具体发生死锁的是哪条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死锁的原因及解决方法)

发表评论

您需要后才能发表评论