暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

【译】阻塞和死锁的区别

原创 快go💨 2022-06-15
1907

原文链接:https://virtual-dba.com/blog/difference-between-blocking-and-deadlocks-sql-server/
作者:Wes Moody

当我了解 DBA 需要了解的 Microsoft SQL Server 问题时,我正在阅读有关死锁的信息。一开始我很困惑,因为这听起来像是我已经比较熟悉的阻塞的定义。我重读了几遍,仍然没有明白。然而,在从几个不同的来源编译了一些信息之后,我把它放在一起来帮助其他可能有同样困扰的人。我希望这有帮助!

Microsoft SQL Server 中的阻塞与死锁

阻塞是由于两个(或更多)进程需要相同的资源而产生的,问题是在 Microsoft SQL Server 中,一次只有一个进程可以访问资源。因此,如果第一个进程已经在使用(或锁定)所需资源,那么第二个进程将被阻止访问它。 Microsoft SQL Server 将强制第二个进程等待,直到第一个进程完成。下图说明了会发生什么:

企业微信截图_20220615105608.png

死锁是不同的,但乍一看很容易混淆。与阻塞一样,死锁涉及两个需要特定资源才能完成的进程。然而,与阻塞不同的是,这两个进程并不试图获取相同的资源。当进程 1 锁定资源 A 而进程 2 锁定资源 B 时会发生死锁。为了使进程 1 完成并释放资源 A,它需要锁定资源 B。但是,为了使进程 2 完成并释放资源 B,它需要锁定资源 A。所以我们遇到了死锁(把它想象成国际象棋的僵局)。下图说明了死锁:
3.png

简而言之,当两个进程需要相同的资源时,就会发生阻塞。第二个进程通常会等待第一个进程释放锁,然后它会完成它的工作。另一方面,当两个进程处于“僵局”时,就会发生死锁,并且任何一方都无法获得所需的东西,因为他们需要锁定对方的进程才能完成工作。通常,Microsoft SQL Server 将通过回滚完成工作最少的进程自行解决死锁,从而允许其他进程继续前进并希望不受阻碍地完成。最终,回滚的进程将重新启动并不受阻碍地完成。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论