Что такое мертвая блокировка в SQL Server и когда он возникает?
Каковы проблемы с мертвой блокировкой и как разрешить его?
В общем, тупик означает, что два или более объекта блокируют некоторые источники, и ни один из них не может завершить работу, потому что их источники блокируются циклически.
Один пример: Допустим, у меня есть таблица A и таблица B, мне нужно сделать некоторое обновление в A, а затем в B, и я решаю заблокировать их обе в момент использования (это действительно глупое поведение, но сейчас оно служит своей цели). В тот же момент кто-то другой делает то же самое в обратном порядке - сначала блокирует B, затем A.
Хронологически это происходит так:
proc1: Lock A
proc2: Lock B
proc1: Lock B - начинает ждать, пока proc2 не освободит B
proc2: Lock A - начинает ждать, пока proc1 не освободит A
Ни один из них никогда не закончит. Это тупик. На практике это обычно приводит к ошибкам таймаута, поскольку нежелательно, чтобы какой-либо запрос висел вечно, а базовая система (например, база данных) будет убивать запросы, которые не завершатся вовремя.
Один из примеров тупика в реальном мире - когда вы запираете ключи от дома в машине, а ключи от машины - в доме.
Тупик - это то, что происходит, когда двум людям требуется несколько ресурсов для выполнения, и когда некоторые из ресурсов заблокированы каждым из людей. Это приводит к тому, что A не может выполнить без того, что есть у B, и наоборот.
Допустим, у меня есть человек A и человек B. Им обоим нужно получить две строки для выполнения (Row1 и Row2).
Человек А не может выполнить команду, потому что ему нужна строка 2, человек Б не может выполнить команду, потому что ему нужна строка 1. Ни одно из лиц никогда не сможет выполнить, потому что они блокируют то, что нужно другому, и наоборот.
Один достаточно простой способ уменьшить тупиковую ситуацию - во всех сложных транзакциях выполнять операции в одном и том же порядке. Другими словами, обращайтесь к таблице 1, затем к таблице 2 в том же порядке. Это поможет уменьшить количество возникающих тупиковых ситуаций.