sqlserver如何处理死锁

sqlserver如何处理死锁

ID:34725994

大小:144.18 KB

页数:11页

时间:2019-03-10

sqlserver如何处理死锁_第1页
sqlserver如何处理死锁_第2页
sqlserver如何处理死锁_第3页
sqlserver如何处理死锁_第4页
sqlserver如何处理死锁_第5页
资源描述:

《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块中的代码失败了,控

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。