Вы когда-нибудь сталкивались с отрицательным SPID при исследовании проблемы производительности в SQL Server? Если да, то вам, возможно, было интересно, как справиться с этой необычной ситуацией. В этой статье мы рассмотрим концепцию отрицательных SPID и обсудим, как решить эту проблему.
Когда вы запускаете команду sp_who2 для проверки проблем с блокировкой на сервере, вы можете столкнуться с основным блокировщиком с SPID -2. Этот отрицательный SPID известен как SPID распределенной транзакции или SPID потерянной распределенной транзакции. Он указывает на то, что транзакция, включающая данные с нескольких серверов, столкнулась с проблемой.
Обычно SQL Server обрабатывает распределенные транзакции прозрачно, обеспечивая соблюдение правил, касающихся свойств ACID базы данных. Однако в некоторых сценариях, таких как отключение сервера от сети или сбой питания на сервере-распределителе, MSDTC (Microsoft Distributed Transaction Coordinator) может не восстановиться должным образом. В результате SPID, обрабатывающий распределенную транзакцию, становится потерянным и получает отрицательное значение -2.
Проблема с отрицательным SPID заключается в том, что он может все еще удерживать ресурсы, такие как блокировки таблицы, страницы или строк, и блокировать другие SPID, которым требуется доступ к тому же объекту базы данных. К сожалению, команда KILL в SQL Server не может обрабатывать SPID со значением меньше 1, поэтому вы не можете просто использовать ее для завершения отрицательного SPID.
Чтобы решить эту проблему, вам необходимо выполнить следующие шаги:
- Выполните следующий запрос, чтобы получить идентификатор Unit of Work (UOW) отрицательного SPID:
Select req_transactionUOW
from master..syslockinfo
where req_spid = -2
Этот запрос вернет 32-значный номер UOW, например, FE4A57F2-28C5-44F9-8416-B08760DFE7E9.
- Используйте номер UOW, чтобы завершить основной блокировщик:
KILL 'FE4A57F2-28C5-44F9-8416-B08760DFE7E9'
После выполнения команды KILL вы можете снова запустить sp_who2, чтобы убедиться, что отрицательный SPID исчез.
Важно отметить, что для выполнения вышеприведенных операторов вам необходимо иметь привилегию processadmin.
В заключение, столкновение с отрицательным SPID в SQL Server может вызывать затруднение, но его можно решить, получив идентификатор UOW, связанный с SPID, и использовав его для завершения процесса. Понимание концепции распределенных транзакций и потерянных SPID может помочь вам устранить и решить подобные проблемы в будущем.
Надеюсь, вам понравилась эта статья, помогающая понять и устранить ошибки отрицательных SPID в SQL Server. Если у вас есть вопросы или комментарии, не стесняйтесь обращаться. Счастливого кодирования!