0

我是SQL服务器的新手,像死锁问题​​一样。我读过关于它的文章。我想了解以下几件事:MS SQL Server中的IsolationLevel,锁定模式,死锁和sp_getapplock

  1. SQL服务器使用适当Lock Mode取决于我,而开始交易设置IsolationLevel。如果这种理解是正确的,那么sp_getapplock的目的是什么?
  2. 我正在运行SQL死锁问题。我的ASP.NET应用程序运行在不同服务器上的几个实例访问同一个数据库。如果我对事务使用适当的IsolationLevel,是否仍然需要使用sp_getapplock获取SQL锁定?

(我知道更合适的解决方案是,以确定有问题的交易,并解​​决这些问题。但仍然是更高的理论问题。)

回答

0

阻止和死锁是两回事。请阅读this article了解更多详情。

以下是文章复制:

开发人员和DBA常常认为自己的SQL Server实例遇到死锁时,实际上,它正经历着严重的阻塞。

阻止会话A在资源(通常是行,页面或表)上请求锁定时发生,但SQL Server无法授予该锁定,因为会话B已在该资源上持有不兼容的锁定。

这是一个暂时的情况,完全可以通过会话B完成其工作并释放其锁定来解决。可能会有多个阻塞链,其中多个会话被阻塞,等待自身阻塞的会话等待另一个阻塞的会话等等,重复多次。然而,在阻断链的头部将是一个头部阻挡器,它不会等待锁定。它可能正在等待一些其他资源,例如锁存器,内存或IO,但至少有一个会话不会等待锁定,并且只要头阻塞程序可以继续处理,阻塞链就会清除。

A 死锁是不同的;它发生在两个或更多会话正在等待彼此时,以这样的方式,任何人都无法完成。死锁可视为循环锁链,其中阻塞链中的每个进程都在等待同一阻塞链中的一个或多个其他进程。

0

sp_getapplock与您的问题没有直接关系。 Applocks是您的应用程序使用的自定义锁,例如,当您需要与外部数据源同步时,使用一些冗长而复杂的过程,并且您不希望多个进程一次运行此类过程。

关于死锁 - 您必须设计程序以尽量减少死锁的可能性,然后您需要创建一些错误处理来检测死锁并采取适当的操作(例如,重试5次,之后失败)。

如果您可以发布您的死锁程序代码,那么可能有人可以帮助您重新设计它。

+0

感谢您的回答。数据库如此庞大而复杂,以至于检测导致死锁的资源本身就是一项挑战。无论如何,我已经问过死锁图。 – Learner

+0

我的旧代码,往往问题在下一个连续:'tran tran;选择xxxx;更新xxxx;提交“ - 如果xxxx包含用于选择和更新的相同记录,则快速出现死锁。如果你在你的'select'语句中加上'(updlock)'提示,许多(不是全部)问题就会消失。 – Arvo