Published on

June 20, 2013

Понимание отрицательных SPID в SQL Server

Вы когда-нибудь сталкивались с отрицательным 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.

Чтобы решить эту проблему, вам необходимо выполнить следующие шаги:

  1. Выполните следующий запрос, чтобы получить идентификатор Unit of Work (UOW) отрицательного SPID:
Select req_transactionUOW
from master..syslockinfo
where req_spid = -2

Этот запрос вернет 32-значный номер UOW, например, FE4A57F2-28C5-44F9-8416-B08760DFE7E9.

  1. Используйте номер UOW, чтобы завершить основной блокировщик:
KILL 'FE4A57F2-28C5-44F9-8416-B08760DFE7E9'

После выполнения команды KILL вы можете снова запустить sp_who2, чтобы убедиться, что отрицательный SPID исчез.

Важно отметить, что для выполнения вышеприведенных операторов вам необходимо иметь привилегию processadmin.

В заключение, столкновение с отрицательным SPID в SQL Server может вызывать затруднение, но его можно решить, получив идентификатор UOW, связанный с SPID, и использовав его для завершения процесса. Понимание концепции распределенных транзакций и потерянных SPID может помочь вам устранить и решить подобные проблемы в будущем.

Надеюсь, вам понравилась эта статья, помогающая понять и устранить ошибки отрицательных SPID в SQL Server. Если у вас есть вопросы или комментарии, не стесняйтесь обращаться. Счастливого кодирования!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.