Ao tentar listar objetos de uma base no Management Studio ocorre o erro: Lock Request time out period exceeded. (Microsoft SQL Server, Error: 1222)

Olá pessoal tudo certo? Espero que sim!

Hoje irei falar sobre um problema pouco conhecido na comunidade mas que pode ocorrer em suas atividades administrativas como um DBA.

Você já se deparou com o erro abaixo ao tentar listar os objetos de uma base de dados no "Management Studio"?


Simulando o problema. 

Crie uma base de dados chamada "testedb": 

create database testedb
go 

Dentro desta base crie uma tabela com duas colunas: 

create table teste (c1 int, c2 int) 

Rode a query abaixo em uma sessão: 

begin tran
alter table teste add c3 int 

Tente agora listar as procedures da base de dados via "Management Studio":


Você acaba recebendo o erro abaixo:


Entendendo e resolvendo o problema. 

Bom, no início da mensagem vemos "lock request time out", então vamos coletar um trace que capture eventos de "Lock: Timeout", conforme imagem abaixo:


Provoque o erro novamente e vá até o Profiler para ver o que foi registrado, você verá dois eventos de timeout registrados, vá até a coluna ObjectID2 e veja o número que nela aparece:


Este recurso não é um Object ID, é um Partition ID. Para pegar o Object ID vamos rodar a query abaixo: 

select * from sys.partitions where partition_id = 281474978938880 

Repare o número que aparece na coluna “object_id”:

Agora, rodando a query abaixo seremos capazes de identificar o objeto: 

select object_name(34)


O Object ID 34 corresponde à sysschobjs, que é um System Base Table, mais informações você pode obter no link abaixo:


A sysschobjs existe em todos os bancos de dados e cada linha representa um objeto. Para fazer uma query contra a sysschobjs é preciso fazer uma conexão via DAC com a instância. Abra um prompt de comando elevado e se conecte usando o DAC na sua instância, no meu caso o comando ficou: 

Sqlcmd –S “.\MSSQL2014” –A 

Agora mude o contexto para nossa base "testedb": 

1>Use testedb
2>go 

Rode o comando abaixo: 

1>select * from sys.sysschobjs
2>go 

Perceba que o comando não termina, volte no "Management Studio" e rode a query abaixo: 

select blocking_session_id,* from sys.dm_exec_requests where blocking_session_id <> 0 
                 
Veja só! Descobrimos quem está bloqueando o acesso a esta tabela de sistema e por sua vez nos impedindo de listar os objetos do banco via "Management Studio":


Vamos conferir o que a sys.dm_tran_locks nos traz de informação para esta sessão 53, rode a query abaixo: 

select resource_type,request_mode,request_session_id from sys.dm_tran_locks where request_session_id = 53 

Perceba que um dos lock’s diz respeito a modificações de schema sobre o objeto:


Suponho que este é o problema, pois embora o objeto que está sendo modificado por nossa sessão executando com "begin tran" não seja a sysschobjs, esta tabela de sistema precisa ser acessada de modo exclusivo durante a modificação da definição de algum objeto, vamos então efetuar o "kill" nesta sessão: 

kill 53 

Veja que o "sqlcmd" conclui o que ele estava tentando fazer, tente agora listar os objetos da base:


É isso pessoal, espero que tenha sido útil a vocês! Abraço!

Um comentário:

  1. E ai Andre, blz ?

    Cara, me tire uma dúvida,,, tenho uma situação parecida, o que está diferente é que o SPID é um BACKGROUND.

    quando executo o comando sp_who2, o ID é 4 e o status é "BACKGROUND" e o comando é descrito como "UNKNOWN TOKEN".

    sabe se posso realizar um kill ?

    att

    ResponderExcluir