其实所有的死锁最深层的缘故原由就是一个:资源竞争 }p!h grHRnIAhdS
体现一: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
+NvgSlC-x0NT?.Qselect * from table1 with(updlock) where ....
上一篇:进步SQL Server性能的几种 | 下一篇:在SQL Server中快速删除重复记录 |