SQLServer死锁的解除方法

 我来答
天罗网17
2022-11-11 · TA获得超过6192个赞
知道小有建树答主
回答量:306
采纳率:100%
帮助的人:73.4万
展开全部

  SQL Server死锁使我们经常遇到的问题 下面就为您介绍如何查询SQL Server死锁 希望对您学习SQL Server死锁方面能有所帮助

  SQL Server死锁的查询方法

  exec master dbo p_lockinfo 显示死锁的进程 不显示正常的进程

  exec master dbo p_lockinfo 杀死死锁的进程 不显示正常的进程

  SQL Server死锁的解除方法

  Create proc p_lockinfo

  @kill_lock_spid bit= 是否杀掉死锁的进程 杀掉 仅显示

  @show_spid_if_nolock bit= 如果没有死锁的进程 是否显示正常进程信息 显示 不显示

  as

  declare @count int @s nvarchar( ) @i int

  select id=identity(int ) 标志

  进程ID=spid 线程ID=kpid 块进程ID=blocked 数据库ID=dbid

  数据库名=db_name(dbid) 用户ID=uid 用户名=loginame 累计CPU时间=cpu

  登陆时间=login_time 打开事务数=open_tran 进程状态=status

  工作站名=hostname 应用程序名=program_name 工作站进程ID=hostprocess

  域名=nt_domain 网卡地址=net_address

  into #t from(

  select 标志= 死锁的进程

  spid kpid a blocked dbid uid loginame cpu login_time open_tran

  status hostname program_name hostprocess nt_domain net_address

  s =a spid s =

  from mastersysprocesses a join (

  select blocked from mastersysprocesses group by blocked

  )b on a spid=b blocked where a blocked=

  union all

  select |_牺牲品_>

  spid kpid blocked dbid uid loginame cpu login_time open_tran

  status hostname program_name hostprocess nt_domain net_address

  s =blocked s =

  from mastersysprocesses a where blocked<>

  )a order by s s

  select @count=@@rowcount @i=

  if @count= and @show_spid_if_nolock=

  begin

  insert #t

  select 标志= 正常的进程

  spid kpid blocked dbid db_name(dbid) uid loginame cpu login_time

  open_tran status hostname program_name hostprocess nt_domain net_address

  from mastersysprocesses

  set @count=@@rowcount

  end

  if @count>

  begin

  create table #t (id int identity( ) a nvarchar( ) b Int EventInfo nvarchar( ))

  if @kill_lock_spid=

  begin

  declare @spid varchar( ) @标志 varchar( )

  while @i<=@count

  begin

  select @spid=进程ID @标志=标志 from #t whereid=@i

  insert #t exec( dbcc inputbuffer( +@spid+ ) )

  if @标志= 死锁的进程 exec( kill +@spid)

  set @i=@i+

  end

  end

  else

  while @i<=@count

  begin

  select @s= dbcc inputbuffer( +cast(进程ID as varchar)+ ) from #t whereid=@i

  insert #t exec(@s)

  set @i=@i+

  end

  select a * 进程的SQL语句=b EventInfo

  from #t a join #t b on a id=b id

lishixinzhi/Article/program/SQLServer/201311/22183

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式