Compartilhar via


MSSQLSERVER_1204

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Detalhes

Atributo Valor
Nome do produto SQL Server
ID do evento 1204
Origem do Evento MSSQLSERVER
Componente SQLEngine
Nome simbólico LK_OUTOF
Texto da mensagem A instância do Mecanismo de Banco de Dados do SQL Server não pode obter um recurso LOCK neste momento. Execute a instrução novamente quando houver menos usuários ativos. Peça ao administrador de banco de dados que verifique a configuração do bloqueio e da memória dessa instância ou as transações de longa execução.

Explicação

Durante a execução, as consultas recebem e liberam bloqueios constantemente nos recursos que acessam. O recebimento de um bloqueio utiliza as estruturas de bloqueio de um pool disponível de estruturas de bloqueio. Quando não é possível receber novos bloqueios porque não há mais nenhuma estrutura de bloqueio disponível no pool, a mensagem de erro 1204 é retornada. Esse problema pode ser devido a qualquer um dos seguintes motivos:

  • O SQL Server não pode alocar mais memória, seja porque outros processos a estão usando ou porque o SQL Server usou toda a sua memória e atingiu o valor configurado usando a opção de configuração max server memory.

  • O gerenciador de bloqueios não pode usar mais de 60% da memória disponível para o SQL Server e o limite já foi atingido.

  • Você define os bloqueios de opção de configuração do procedimento armazenado do sistema sp_configure (Transact-SQL) como um valor não padrão e não dinâmico.

  • Você habilitou os sinalizadores de rastreamento 1211, 1224 ou ambos no SQL Server para controlar o comportamento de escalonamento de bloqueios e está executando consultas que exigem muitos bloqueios.

Ação do usuário

  • Se você suspeitar que o SQL Server não pode alocar memória suficiente, tente as seguintes opções:

    • Identifique se algum outro administrador de memória dentro do SQL Server usou uma grande parte da memória configurada do SQL Server, usando uma consulta como a seguinte:

      SELECT pages_kb, type, name, virtual_memory_committed_kb, awe_allocated_kb
      FROM sys.dm_os_memory_clerks
      ORDER BY pages_kb DESC;
      

      Depois, reduza o consumo de memória desse administrador de memória para permitir que a memória de bloqueio utilize mais recursos. Para obter mais informações, consulte Solucionar problemas de memória insuficiente ou de memória insuficiente no SQL Server.

    • Se outros aplicativos além do SQL Server estiverem consumindo recursos, tente interromper esses aplicativos ou considere executá-los em um servidor separado. Isso libera memória de outros processos para o SQL Server.

    • Se você configurou a memória máxima do servidor, aumente a configuração de memória máxima do servidor.

  • Se você suspeitar que o gerenciador de bloqueios usou a quantidade máxima de memória disponível, identifique a transação que está mantendo a maioria dos bloqueios e encerre-a. O script a seguir identifica a transação que tem mais bloqueios:

    SELECT request_session_id, COUNT (*) num_locks
    FROM sys.dm_tran_locks
    GROUP BY request_session_id
    ORDER BY count (*) DESC;
    

    Pegue o ID de sessão mais alto e encerre-o usando o comando KILL .

  • Se você estiver usando um valor não padrão para locks, use sp_configure para alterar o valor de locks para sua configuração padrão usando a seguinte instrução:

    EXEC sp_configure 'locks', 0;
    
  • Se você encontrou a mensagem de erro acima ao usar os sinalizadores de rastreamento do SQL Server 1211, 1224 ou ambos, revise seu uso e desabilite-os durante a execução de consultas que exigem um grande número de bloqueios. Para obter mais informações, examine DBCC TRACEON – Sinalizadores de rastreamento (Transact-SQL) e Resolver problemas de bloqueio causados pelo escalonamento de bloqueios no SQL Server.