- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
SQL Server如何处理死锁
死锁产生的情形是由于两个事务彼此互相等待对方放弃各自的锁造成的。
当出现这种情况时,SQL Server会自动选择一个关掉进程,允许另一个进程继续执行来结束死锁。关闭的事务会被回滚并抛出一个错误的消息发送给执行该进程的用户。一般来说,事务需要最少数量的开销来回滚锁撤销的事务。
这篇文章将解释如何以一种友好的方式来处理死锁问题。
死锁
事务A企图更新表1并且同时从第2张表执行读或更新操作,而事务B其它更新表2并同时从表1执行读或更新操作。再这种情形下,事务A打开锁以便事务B需要完成它的任务,反之亦然;这样事务都不能完成直到其它事务释放锁为止。
死锁的解决方案
下面的示例展示了两个事务之间造成死锁的情形。
事务 A
BEGIN TRANSACTIONUPDATE Customer SET LastName = John WHERE CustomerId=111WAITFOR DELAY 00:00:05 -- Wait for 5 msUPDATE Orders SET CustomerId = 1 WHERE OrderId = 221COMMIT TRANSACTION
事务B
BEGIN TRANSACTIONUPDATE Orders SET ShippingId = 12 WHERE OrderId = 221WAITFOR DELAY 00:00:05 -- Wait for 5 msUPDATE Customer SET FirstName = Mike WHERE CustomerId=111COMMIT TRANSACTION
如果两个事务都在同一时间执行,那么事务A会锁住并更新Customer表,而此时事务B会锁住并更新Orders表。延迟5 ms之后,事务A会寻找锁住的Orders表而该表已经被事务B锁住,此时,事务B会寻找被事务A锁住的Customer表。因此,两个事务一直都不能执 行,死锁产生了,并且SQL server会为放弃的事务返回一个错误消息1205.
(1 row(s) affected)Msg 1205, Level 13, State 45, Line 5Transaction (Process ID 52) was deadlocked on lock resources with another process and has been chosen as the deadlock victim.Rerun the transaction.
但是如果你不想看到系统默认的处理行为(放弃事务)应该如何实现呢?你可以改变它吗?是的,可以,通过重写下面展示的事务A和事务B即可实现。
事务 A
RETRY: -- Label RETRYBEGIN TRANSACTIONBEGIN TRY????UPDATE Customer SET LastName = John WHERE CustomerId=111????WAITFOR DELAY 00:00:05??-- Wait for 5 ms????UPDATE Orders SET CustomerId = 1 WHERE OrderId = 221????COMMIT TRANSACTIONEND TRYBEGIN CATCH????PRINT Rollback Transaction????ROLLBACK TRANSACTION????IF ERROR_NUMBER() = 1205 -- Deadlock Error Number????BEGIN????????WAITFOR DELAY 00:00:00.05 -- Wait for 5 ms????????GOTO RETRY -- Go to Label RETRY????ENDEND CATCH
事务 B
RETRY: -- Label RETRYBEGIN TRANSACTIONBEGIN TRY????UPDATE Orders SET ShippingId = 12 Where OrderId = 221????WAITFOR DELAY 00:00:05 -- Wait for 5 ms????UPDATE Customer SET FirstName = Mike WHERE CustomerId=111????COMMIT TRANSACTIONEND TRYBEGIN CATCH????PRINT Rollback Transaction????ROLLBACK TRANSACTION????IF E
文档评论(0)