当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2011-05-02 15:21:00  来源:本站整理

若何削减SQL Server数据库中死锁发生[MSSQL防范]

赞助商链接



  本文“若何削减SQL Server数据库中死锁发生[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

这篇文章主要针对sql server数据库死锁现象的预防及办理办法举行了具体的介绍,更多内容请大家参考下文:

死锁是指在某组资源中,两个或两个以上的线程在履行历程中,在争取某一资源时而造成彼此等候的现象,若无外力的作用下,它们都将无法促进下去,死时便大概会产死活锁,这些永久在彼此等候的进程称为死锁线程.简单的说,进程A等候进程B释放他的资源,B又等候A释放他的资源,这样彼此等候就形成死锁.

如在数据库中,假如需求对一条数据举行改正,首先数据库管理系统会在上面加锁,以保证在同一时间只有一个事件能举行改正操作.如事件1的线程 T1具有表A上的排它锁,事件2的线程T2 具有表B上的排它锁,并且之后需求表A上的锁.事件2无法得到这一锁,因为事件1已拥有它.事件2被阻塞,等候事件1.然后,事件1需求表B的锁,但无法得到锁,因为事件2将它锁定了.事件在提交或回滚之前不能释放持有的锁.因为事件需求对方掌握的锁才能持续操作,所以它们不能提交或回滚,这样数据库就会发死活锁了.

如在编写存储历程的时刻,由于有些存储历程事件性的操作对比频繁,假如先锁住表A,再锁住表B,那么在全部的存储历程中都要按照这个次序来锁定它们.假如无意中某个存储历程中先锁定表B,再锁定表A,这大概就会招致一个死锁.并且死锁普通是不太简单被发现的.

假如服务器上常常呈现这种死锁情形,就会降低服务器的性能,所以利用程序在利用的时刻,我们就需求对其举行跟踪,利用sp_who和sp_who2来肯定大概是哪些用户阻塞了其他用户,我们还可以用下面的存储历程来跟踪具体的死锁履行的影响:

create  procedure sp_who_lock
as
begin
declare @spid int,@bl int,
@intTransactionCountOnEntry  int,
@intRowcount    int,
@intCountProperties   int,
@intCounter    int 
 create table #tmp_lock_who (id int identity(1,1),spid smallint,bl smallint)
 
 IF @@ERROR<>0 RETURN @@ERROR
 
 insert into #tmp_lock_who(spid,bl) select  0 ,blocked
   from (select * from sysprocesses where  blocked>0 ) a 
   where not exists(select * from (select * from sysprocesses where  blocked>0 ) b 
   where a.blocked=spid)
   union select spid,blocked from sysprocesses where  blocked>0

 IF @@ERROR<>0 RETURN @@ERROR 
  
-- 找到暂时表的记录数
 select  @intCountProperties = Count(*),@intCounter = 1
 from #tmp_lock_who
 
 IF @@ERROR<>0 RETURN @@ERROR 
 
 if @intCountProperties=0
  select '目前没有阻塞和死锁信息' as message

-- 循环开始
while @intCounter <= @intCountProperties
begin
-- 取第一条记录
  select  @spid = spid,@bl = bl
  from #tmp_lock_who where id = @intCounter 
 begin
  if @spid =0 
    select '惹起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + '
进程号,其履行的SQL语法以下'
 else
    select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '

进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,

其当行进程履行的SQL语法以下'
 DBCC INPUTBUFFER (@bl )
 end 

-- 循环指针下移
 set @intCounter = @intCounter + 1
end


drop table #tmp_lock_who

return 0
end

我们只需求通过在查询解析器里面履行sp_who_lock,便可以具体捕捉到履行的堵塞进程,这时我们便可以对对应的SQL语句大概存储历程举行性能上面的改良及计划.


  以上是“若何削减SQL Server数据库中死锁发生[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 若何削减系统启动项让Win7电脑开机更快些
  • windows下若何削减电脑开机转动条次数
  • 若何削减SQL Server数据库中死锁发生
  • 教你若何削减数据中央电力损耗(图)
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .