当前位置:首页 > PHP教程 > PHP总结归纳

如何减少SQLServer死锁发生

死锁是指在某组资源中,两个或两个以上的线程在执行过程中,在争夺某一资源时而造成互相等待的现象,若无外力的作用下,它们都将无法推进下去,死时就可能会产生死锁,这些永远在互相等待的进程称为死锁线程。简单的说,进程a等待进程b释放他的资源,b又等待a

  死锁是指在某组资源中,两个或两个以上的线程在执行过程中,在争夺某一资源时而造成互相等待的现象,若无外力的作用下,它们都将无法推进下去,死时就可能会产生死锁,这些永远在互相等待的进程称为死锁线程。简单的说,进程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 @@error0 return

  @@errorinsert into

  #tmp_lock_who(spid,bl) select

  0 ,blockedfrom (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>0if

  @@error0 return @@error -- 找到临时表的记录数select

  @intcountproperties = count(*),@intcounter = 1from #tmp_lock_whoif

  @@error0 return @@error if @intcountproperties=0select

  '现在没有阻塞和死锁信息'

  as message-- 循环开始while @intcounter
【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!