SPID -2! O QUE FAZER?



                Você por acaso já se deparou com o SPID negativo -2 em seu SQL Server gerando cadeias de bloqueios? Pois é, esta situação pode acontecer caso algo tenha dado errado em uma transação envolvendo o Microsoft Distributed Transaction Coordinator, mais conhecido como MSDTC.

                O MSDTC é utilizado quando uma transação envolve registros que se encontram em mais de um servidor. Imagine que durante a execução de determinada transação, ocorram falhas de rede, “shut down” inesperado de algum servidor envolvido etc. Geralmente o MSDTC consegue lidar com isso baseado nas propriedades ACID das bases de dados, contudo, quando ele não consegue se recuperar destas falhas e a transação não pode mais prosseguir, ela acaba virando uma transação órfão.

                Para marcar que a transação é órfão, o SQL muda o SPID de um número positivo para o negativo -2, infelizmente, esta transação continua mantendo os locks adquiridos, de acordo com o nível de isolamento transacional que estava sendo utilizado e pode acabar gerando as cadeias de bloqueios para os demais SPID’s que tentam acessar os mesmos. Certo, você deve estar pensando em utilizar o KILL e acabar com o problema, mas ao executa-o, surpresa! O erro abaixo aparece:



Msg 6101, Level 16, State 1, Line 1
Process ID -2 is not a valid process ID.
Choose a number between 1 and 2048 



                Pois é, o KILL não funciona para SPID’s negativos. O que fazer então? A solução não é difícil, e irei mostrar em poucas etapas como aplicá-la:



1. Execute a query abaixo caso você esteja lidando com o SQL Server 2000:


select req_transactionUOW from master..syslockinfo where req_spid = -2



A partir do SQL 2005 já podemos utilizar a query abaixo pois a syslockinfo será descontinuada em versões posteriores:


select request_owner_guid from sys.dm_tran_locks where request_session_id = -2



Como resultado você irá ver um número de 32 dígitos chamado de UOW (Unit of Work).



2. Execute o KILL passando o UOW obtido no passo um entre aspas simples:


KILL 'DEF12075-0281-4878-A784-CD66A13F3201'

  

PRONTO! Agora basta aguardar a finalização do KILL que não costuma demorar neste cenário.



Pessoal, tentei explicar da melhor forma esta questão relacionada as transações órfãos provenientes, o post foi baseado nos dois links abaixo para quem quiser se aprofundar um pouco mais no assunto:











Espero que tenham gostado! Um abraço e até o próximo Post!

2 comentários: