- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
SQLServer如何处理死锁.doc
SQL Server如何处理死锁
【IT168 专稿】死锁产生的情形是由于两个事务彼此互相等待对方放弃各自的锁造成的。
当出现这种情况时,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 = 221
COMMIT 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=111
COMMIT 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 TR
您可能关注的文档
- OpenCV学习笔记A.doc
- Oraclesys和system用户.doc
- oracle多粒度锁.doc
- Oracle数据库中关键字.doc
- Oracle数据库密码相关参数设置.doc
- oracle用户解锁与加锁.doc
- oracle登陆用户及密码.doc
- OSPF传播外部路由到多个领域如何.doc
- Outlook无法显示地址列表.doc
- paperpass论文修改葵花宝典.doc
- 2025年浙江省绍兴市选调生考试(公共基础知识)综合能力题库及答案1套.docx
- 2025年城市地下停车场跨境智慧管理系统在优化城市交通结构中的创新应用.docx
- [47223522]1.1《声音是什么》练习++---2024-2025学年苏科版物理八年级上学期.docx
- 2024年化工技能鉴定题库检测试题打印必考题附答案详解.docx
- 2024年化工技能鉴定题库检测试题打印带答案详解(突破训练).docx
- 2024年化工技能鉴定题库检测试题打印带答案详解(考试直接用).docx
- 工程造价管理PPT课件.pptx
- 2024年化工技能鉴定题库检测试题打印带答案详解(夺分金卷).docx
- 2024年化工技能鉴定题库检测试题打印含答案详解【轻巧夺冠】.docx
- 2024年化工技能鉴定题库检测试题打印含答案详解【能力提升】.docx
文档评论(0)