Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по курсу ИСиТ.docx
Скачиваний:
6
Добавлен:
07.02.2024
Размер:
1.07 Mб
Скачать

Взаимоблокировка

Взаимоблокировка возникает, когда две и более задач постоянно блокируют друг друга в ситуации, когда у каждой задачи заблокирован ресурс, который пытаются заблокировать другие задачи. Например:

  • Транзакция А создает общую блокировку строки 1.

  • Транзакция Б создает общую блокировку строки 2.

  • Транзакция А теперь запрашивает монопольную блокировку строки 2 и блокируется до того, как транзакция Б закончится и освободит общую блокировку строки 2.

  • Транзакция Б теперь запрашивает монопольную блокировку строки 1 и блокируется до того, как транзакция A закончится и освободит общую блокировку строки 1.

Транзакция А не может завершиться до того, как завершится транзакция Б, а транзакция Б заблокирована транзакцией А. Такое условие также называется цикличной зависимостью: транзакция А зависит от транзакции Б, а транзакция Б зависит от транзакции А и этим замыкает цикл.

Обе транзакции находятся в состоянии взаимоблокировки и будут всегда находиться в состоянии ожидания, если взаимоблокировка не будет разрушена внешним процессом. Монитор взаимоблокировок компонента Microsoft SQL Server Database Engine периодически проверяет задачи на состояние взаимоблокировки. Если монитор обнаруживает цикличную зависимость, то выбирается одна задача, для которой транзакция будет завершена с ошибкой. Это позволяет другой задаче завершить свою транзакцию. Позднее приложение может повторно выполнить транзакцию, которая завершилась с ошибкой, обычно после того как другая транзакция (бывшая в состоянии взаимоблокировки) завершится.

На рисунке транзакция Т1 зависит от транзакции Т2 для ресурса блокировки таблицы Деталь. Аналогично транзакция Т2 зависит от транзакции Т1 для ресурса блокировки таблицы Поставщик. Так как эти зависимости из одного цикла, возникает взаимоблокировка транзакций T1 и T2.

Отображение сведений о блокировках

  • SQL Server 2008

  • SQL Server 2005

SQL Server предоставляет несколько способов получить сведения об активности текущей блокировки на экземпляре компонента SQL Server Database Engine.

Подраздел

Описание

Server Profiler Locks

С помощью приложения SQL Server Profiler можно задать категорию событий блокировки, чтобы получать сведения о событиях блокировки в журнал трассировки.

SQL Server, объект Locks

В системном мониторе можно указать счетчики объекта блокировок, чтобы контролировать уровень блокирования на экземпляре компонента Database Engine.

sys.dm_tran_locks (Transact-SQL)

Можно выполнить запрос к представлению динамического управления sys.dm_tran_locks, чтобы получить сведения о текущем состоянии блокировки экземпляра компонента Database Engine.

Xevents

Получать сообщения о блокировках можно при помощи механизма расширенных событий. При использовании Xevents наряду с событиями можно отслеживать данные контекста выполнения, такие как стеки вызовов Transact SQL или обработчиков плана выполнения. События Xevents могут захватываться несколькими типами различных выходов, включая трассировку событий для Windows (ETW).

Соседние файлы в предмете Информатика