MS SQL Server中的IsolationLevel,Lock Modes,deadlocks和sp_getapplock

时间:2017-03-09 05:04:57

标签: sql-server database isolation-level database-deadlocks transaction-isolation

我是SQL服务器的新手,并且像问题一样死锁。我读过有关它的文章。我想了解以下事项:

  1. SQL服务器使用适当的Set Windows system environment variables using CMD,具体取决于我在开始交易时设置的Lock Mode。如果这种理解是正确的,IsolationLevel的目的是什么?
  2. 我遇到了SQL死锁问题。我在不同服务器上运行的ASP.NET应用程序的几个实例访问同一个数据库。如果我在事务上使用适当的IsolationLevel,是否仍需要使用sp_getapplock获取SQL锁?
  3. (我知道更合适的解决方案是识别有问题的交易并修复它们。但它仍然是一个理论问题。)

2 个答案:

答案 0 :(得分:0)

阻塞和死锁是两回事。有关详细信息,请阅读this article

从文章中复制以下内容:

开发人员和DBA经常认为他们的SQL Server实例遇到了严重阻塞的时候遇到了死锁。

当会话A请求对资源(通常是行,页或表)进行锁定时,会发生

阻止,但SQL Server无法授予该锁定,因为会话B已经拥有对此的不兼容锁定资源。

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

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

答案 1 :(得分:0)

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

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

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