IsolationLevel, режимы блокировки, взаимоблокировки и sp_getapplock в MS SQL Server

Я новичок в SQL-сервере и проблемах с блокировкой. Я читал статьи об этом. Я хочу понять следующие вещи:

  1. SQL-сервер использует соответствующий режим блокировки в зависимости от на IsolationLevel, который я установил в начале перевод. Если это понимание правильное, какова цель sp_getapplock?
  2. Я столкнулся с проблемой взаимоблокировки SQL. Несколько экземпляров моего приложения ASP.NET, работающего на разных серверах, обращаются к одной и той же базе данных. Если я использую соответствующий IsolationLevel для транзакций, нужно ли мне по-прежнему получать блокировку SQL с помощью sp_getapplock?

(Я знаю, что более подходящим решением является выявление проблемных транзакций и их исправление. Но все же это скорее теоретический вопрос.)


person Learner    schedule 09.03.2017    source источник


Ответы (2)


Блокировка и взаимоблокировка - разные вещи. Пожалуйста, прочтите эту статью для получения более подробной информации. .

Далее скопировано из статьи:

Разработчики и администраторы баз данных часто думают, что их экземпляр SQL Server испытывает тупиковые ситуации, хотя на самом деле он испытывает серьезную блокировку.

Блокировка происходит, когда сеанс A запрашивает блокировку ресурса (обычно строки, страницы или таблицы), но SQL Server не может предоставить эту блокировку, поскольку сеанс B уже удерживает несовместимую блокировку этого ресурса.

Это временная ситуация, и она может быть полностью разрешена сеансом B, завершившим свою работу и разблокировавшим свои блокировки. Возможны обширные цепочки блокировки, в которых несколько сеансов блокируются в ожидании сеанса, который сам заблокирован в ожидании другого заблокированного сеанса, и так далее, повторяясь несколько раз. Однако во главе цепочки блокировки будет головной «блокировщик», не ожидающий блокировки. Он может ожидать какого-то другого ресурса, такого как защелка, память или ввод-вывод, но по крайней мере один сеанс не будет ожидать блокировки, и цепочка блокировки будет очищена, как только головной блокиратор сможет продолжить обработку.

Взаимоблокировка — это другое; это происходит, когда два или более сеанса ожидают друг друга таким образом, что ни один из них не может завершиться. Взаимоблокировку можно рассматривать как циклическую цепочку блокировок, в которой каждый отдельный процесс в цепочке блокировки ожидает один или несколько других процессов в той же цепочке блокировки.

person Learner    schedule 20.03.2017

sp_getapplock не имеет прямого отношения к вашим проблемам. Блокировки приложений — это настраиваемые блокировки, используемые вашим приложением, например, когда вам нужно синхронизироваться с внешним источником данных, используя какую-то длительную и сложную процедуру, и вы не хотите, чтобы несколько процессов запускали такую ​​процедуру одновременно.

Что касается тупиковых ситуаций - вы должны спроектировать свои процедуры так, чтобы свести к минимуму возможность тупиковой ситуации, а затем вам нужно создать некоторую обработку ошибок для обнаружения тупиковых ситуаций и принятия соответствующих мер (например, повторить попытку 5 раз, после чего произойдет сбой).

Если бы вы могли опубликовать свой код процедуры взаимоблокировки, то, вероятно, кто-то мог бы помочь вам изменить его.

person Arvo    schedule 20.03.2017
comment
Спасибо за Ваш ответ. База данных настолько велика и сложна, что обнаружение ресурсов, вызывающих взаимоблокировку, само по себе является сложной задачей. Я все равно попросил график взаимоблокировки. - person Learner; 20.03.2017
comment
Im мой старый код, часто проблема заключается в следующей последовательности: begin tran; select xxxx; update xxxx; commit - если xxxx содержит одинаковые записи для выбора и обновления, то быстро появляется взаимоблокировка. Если вы добавите подсказку with(updlock) к своему selectутверждению, многие (не все) проблемы исчезнут. - person Arvo; 20.03.2017