Что такое мертвая блокировка в базе данных?

Что такое мертвая блокировка в SQL Server и когда он возникает?

Каковы проблемы с мертвой блокировкой и как разрешить его?

16
задан Vlad Mihalcea 29 October 2019 в 10:41
поделиться

2 ответа

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

Один пример: Допустим, у меня есть таблица A и таблица B, мне нужно сделать некоторое обновление в A, а затем в B, и я решаю заблокировать их обе в момент использования (это действительно глупое поведение, но сейчас оно служит своей цели). В тот же момент кто-то другой делает то же самое в обратном порядке - сначала блокирует B, затем A.

Хронологически это происходит так:

proc1: Lock A

proc2: Lock B

proc1: Lock B - начинает ждать, пока proc2 не освободит B

proc2: Lock A - начинает ждать, пока proc1 не освободит A

Ни один из них никогда не закончит. Это тупик. На практике это обычно приводит к ошибкам таймаута, поскольку нежелательно, чтобы какой-либо запрос висел вечно, а базовая система (например, база данных) будет убивать запросы, которые не завершатся вовремя.

Один из примеров тупика в реальном мире - когда вы запираете ключи от дома в машине, а ключи от машины - в доме.

29
ответ дан 30 November 2019 в 16:18
поделиться

Тупик - это то, что происходит, когда двум людям требуется несколько ресурсов для выполнения, и когда некоторые из ресурсов заблокированы каждым из людей. Это приводит к тому, что A не может выполнить без того, что есть у B, и наоборот.

Допустим, у меня есть человек A и человек B. Им обоим нужно получить две строки для выполнения (Row1 и Row2).

  • Человек A блокирует Row1 и пытается получить Row2.
  • Человек B блокирует Row2 и пытается получить Row1.

Человек А не может выполнить команду, потому что ему нужна строка 2, человек Б не может выполнить команду, потому что ему нужна строка 1. Ни одно из лиц никогда не сможет выполнить, потому что они блокируют то, что нужно другому, и наоборот.


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

8
ответ дан 30 November 2019 в 16:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: