Подтвердить что ты не робот

Что такое тупик в базе данных?

Что такое тупик в sql-сервере и когда он возникает? Каковы проблемы с тупиком и как его решить?

4b9b3361

Ответ 1

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

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

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

proc1: блокировка A

proc2: блокировка B

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

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

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

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

Ответ 2

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

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

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

Лицо A не может работать, потому что ему нужно Row2, Person B не может работать, потому что ему нужен Row1. Ни один человек никогда не сможет выполнить, потому что они блокируют то, что нужно другим, и наоборот.


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

Ответ 3

Тупик, который может возникнуть, когда две (или более) транзакции ожидая освобождения замков, которые удерживаются другим.