欢迎来到天天文库
浏览记录
ID:34725994
大小:144.18 KB
页数:11页
时间:2019-03-10
《sqlserver如何处理死锁》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、SQLServer如何处理死锁 死锁产生的情形是由于两个事务彼此互相等待对方放弃各自的锁造成的。 当出现这种情况时,SQLServer会自动选择一个关掉进程,允许另一个进程继续执行来结束死锁。关闭的事务会被回滚并抛出一个错误的消息发送给执行该进程的用户。一般来说,事务需要最少数量的开销来回滚锁撤销的事务。 这篇文章将解释如何以一种友好的方式来处理死锁问题。 死锁 事务A企图更新表1并且同时从第2张表执行读或更新操作,而事务B其它更新表2并同时从表1执行读或更新操作。再这种情形下,事务A打开锁以便事务B需要完成它的任务,反之亦然;这样事务都不能完成直到其它事务释放锁为止。 死锁
2、的解决方案 下面的示例展示了两个事务之间造成死锁的情形。 事务ABEGINTRANSACTIONUPDATECustomerSETLastName='John'WHERECustomerId=111WAITFORDELAY'00:00:05'--Waitfor5msUPDATEOrdersSETCustomerId=1WHEREOrderId=221COMMITTRANSACTION 事务BBEGINTRANSACTIONUPDATEOrdersSETShippingId=12WHEREOrderId=221WAITFORDELAY'00:00:05'--Waitfor5msUPD
3、ATECustomerSETFirstName='Mike'WHERECustomerId=111COMMITTRANSACTION 如果两个事务都在同一时间执行,那么事务A会锁住并更新Customer表,而此时事务B会锁住并更新Orders表。延迟5ms之后,事务A会寻找锁住的Orders表而该表已经被事务B锁住,此时,事务B会寻找被事务A锁住的Customer表。因此,两个事务一直都不能执行,死锁产生了,并且SQLserver会为放弃的事务返回一个错误消息1205.(1row(s)affected)Msg1205,Level13,State45,Line5Transaction(P
4、rocessID52)wasdeadlockedonlockresourceswithanotherprocessandhasbeenchosenasthedeadlockvictim.Rerunthetransaction. 但是如果你不想看到系统默认的处理行为(放弃事务)应该如何实现呢?你可以改变它吗?是的,可以,通过重写下面展示的事务A和事务B即可实现。 事务ARETRY:--LabelRETRYBEGINTRANSACTIONBEGINTRY UPDATECustomerSETLastName='John'WHERECustomerId=111 WAITFORDE
5、LAY'00:00:05' --Waitfor5ms UPDATEOrdersSETCustomerId=1WHEREOrderId=221 COMMITTRANSACTIONENDTRYBEGINCATCH PRINT'RollbackTransaction' ROLLBACKTRANSACTION IFERROR_NUMBER()=1205--DeadlockErrorNumber BEGIN WAITFORDELAY'00:00:00.05'--Waitfor5ms GOTORETRY--GotoLabelRETRY
6、 ENDENDCATCH 事务BRETRY:--LabelRETRYBEGINTRANSACTIONBEGINTRY UPDATEOrdersSETShippingId=12WhereOrderId=221 WAITFORDELAY'00:00:05'--Waitfor5ms UPDATECustomerSETFirstName='Mike'WHERECustomerId=111 COMMITTRANSACTIONENDTRYBEGINCATCH PRINT'RollbackTransaction' ROLLBACKTRANSACTION
7、 IFERROR_NUMBER()=1205--DeadlockErrorNumber BEGIN WAITFORDELAY'00:00:00.05'--Waitfor5ms GOTORETRY--GotoLabelRETRY ENDENDCATCH 这里我在两个事务的开始时使用了标签RETRY来实现。TRY/CATCH方法用来在事务中处理异常。如果写在TRY块中的代码失败了,控
此文档下载收益归作者所有