что такое тупик в базе данных? - PullRequest
14 голосов
/ 05 мая 2010

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

Ответы [ 3 ]

26 голосов
/ 05 мая 2010

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

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

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

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

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

Очевидно, что ни один из них не закончит. Это тупик.

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

8 голосов
/ 05 мая 2010

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

Допустим, у меня есть Персона A и Персона B. Им обоим нужно запустить два ряда (Row1 и Row2).

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

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


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

1 голос
/ 30 июня 2014

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

...