English

速达软件
     
当前位置:速达软件 >> 技术支持 >> 浏览文章

SQL Server死锁产生缘故原由及解决办法

发布日期:2009年07月31日 浏览次数: 作者:佚名  

  其实所有的死锁最深层的缘故原由就是一个:资源竞争 }p!h gr HRnIAhdS

  体现一:2 ?)! q~CzG__BE.9|

  一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B(锁住了表B),然后企图访问表A,这时用户A因为用户B已经锁住表B,它必须等待用户B释放表B,才能继承,好了他老人家就只好老忠实实在这等了,同样用户B要等用户A释放表A才能继承这就死锁了。b\'*"kSOX@nnHEe

  解决方法:8?E:3Yj8).hI-G"/g

  这种死锁是因为你的程序的BUG产生的,除了调整你的程序的逻辑别无他法s*cp'd"@=;yIn@l

  细心分析你程序的逻辑:](q€I)(y=W^[df=s

  1:尽量避免同时锁定两个资源BZ'Xp=N tiK:#^} N=

  2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照雷同的顺序来锁定资源.=U^0N#+d^9*EAb{ 

  体现二:V(% MLoG ?yX((5^ F

  用户A读一条纪录,然后修改该条纪录。这是用户B修改该条纪录,这里用户A的事务里锁的性子由共享锁企图上升到独占锁(for update),而用户B里的独占锁因为A有共享锁存在所以必须等A释放掉共享锁,而A因为B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。,#\]Q-,N€6k#nK2XKa

  这种死锁比较潜伏,但其实在稍大点的项目中经常发生。.:Q(.9sQGM"LKpQ

  解决方法:# (+-C?24)J:gy

  让用户A的事务(即先读后写类型的操作),在select 时就是用Update lock pH\tBL*_H=B @

  语法如下:MQQ=-\':?-I:/.tNQK

select * from table1 with(updlock) where ....
+NvgSlC-x0NT?.Q
[版权归原作者及coolcxm共同拥有,转载请注明出处]
 
上一篇:进步SQL Server性能的几种 下一篇:在SQL Server中快速删除重复记录