2017-01-25 16 views
2

Я неспособен понять deadlock_xml от Azure SQL Server V12. Вот график (что согласуется с основным XML):Столбцы SQL Server: пожалуйста, объясните

enter image description here

  • Таким образом, процесс ок издал замок Update и процесс л.ш., который также хочет блокировку обновления на тот же ресурс , должен ждать.

  • Затем процесс rhs запрашивает эксклюзивную блокировку на том же ресурсе, который, по-видимому, заблокирован из-за блокировки обновления процесса lhs (почему? Потому что он запросил один?!).

Моим вопрос:

Почему процесс ок не может ограничить блокировку U к замку X?

Я пытаюсь понять это на высоком уровне, но, тем не менее, здесь есть специфика:

  • Оба процесса были запущены один и тот же зр

  • ИСПАНИИ выполняет upsert оп : Вставить, где не существует (Выбрать ...); if @@ ROWCOUNT = 0 Update ...

  • транзакции были сериализованы.

ответ

1

Оба действия влияют на одну и ту же таблицу. Вы видите Блокировка ключа по индексу первичного ключа «PK_Product».

я пытаюсь поставить его в простом примере:

Люди приходят в комнату и говорят: «Я собираюсь снести эту стену» и выходит, чтобы получить свои инструменты. Другой приходит и говорит: «Я собираюсь нарисовать эту стену!» и выходит, чтобы получить цвет. Теперь оба возвращаются и хотят начать работу. Один, срывающий стену, начинается немного раньше. Теперь для второго человека нет смысла ждать. Эти процессы не могут быть сериализованы. Он не может ждать, пока не закончится первый. Работа первого человека изменила основу его работы и сделала невозможным.

Для вас это означает: Оба процесса говорят: «Мы собираемся обновить эту таблицу, но сначала проверяем какое-то условие». Поскольку INSERT влияет на первичный ключ, второй процесс не может ждать и продолжить немного позже. Этот процесс можно убить и снова запустить.

Возможно, вы можете взглянуть на MERGE-command, что позволяет вам отображать upsert за один раз.

+0

@ Шунго Спасибо за ваш ответ! Теперь это ясно. Я был наивным, чтобы ожидать блокировки на логическом, а не на физическом уровне. Слияние с уровнем изоляции «serializable» действительно является решением моей проблемы с перенапряжением. К сожалению, у меня недостаточно отзывов, чтобы публично публиковать свой ответ. – PBof