Compartir a través de


MSSQLSERVER_1204

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Detalles

Attribute Valor
Nombre del producto SQL Server
Id. de evento 1204
Origen de eventos MSSQLSERVER
Componente SQLEngine
Nombre simbólico LK_OUTOF
Texto del mensaje La instancia del motor de base de datos de SQL Server no puede obtener un recurso LOCK en este momento. Vuelva a ejecutar la instrucción cuando haya menos usuarios activos. Pida al administrador de la base de datos que compruebe la configuración de bloqueos y memoria de esta instancia o si hay transacciones que se ejecutan durante mucho tiempo.

Explicación

Durante la ejecución, las consultas suelen adquirir y liberar frecuentemente bloqueos en los recursos a los que acceden. La adquisición de un bloqueo utiliza las estructuras de bloqueo de un grupo disponible de estructuras de bloqueo. Cuando no se pueden adquirir bloqueos nuevos porque no hay más estructuras de bloqueo disponibles en el grupo, se devuelve el mensaje de error 1204. Este problema puede deberse a cualquiera de los siguientes motivos:

  • SQL Server no puede asignar más memoria, ya sea porque otros procesos lo usan o porque SQL Server ha usado toda su memoria y ha alcanzado el valor configurado mediante la opción de configuración max server memory (Memoria máxima del servidor).

  • El administrador de bloqueos no puede usar más del 60 % de la memoria disponible para SQL Server y ya se ha cumplido el umbral.

  • Configure los bloqueos de opción de configuración del procedimiento almacenado del sistema sp_configure (Transact-SQL) en un valor no dinámico y no predeterminado.

  • Ha habilitado marcas de seguimiento 1211, 1224 o ambas en SQL Server para controlar el comportamiento de escalación de bloqueos y está ejecutando consultas que requieren muchos bloqueos.

Acción del usuario

  • Si sospecha que SQL Server no puede asignar memoria suficiente, pruebe las siguientes opciones:

    • Identifique si algún otro distribuidor de memoria dentro de SQL Server ha usado una gran parte de la memoria configurada de SQL Server mediante una consulta como la siguiente:

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

      A continuación, reduzca el consumo de memoria de ese distribuidor de memoria para permitir que la memoria de bloqueo use más recursos. Para obtener más información, consulte Solución de problemas de memoria insuficiente o de memoria insuficiente en SQL Server.

    • Si hay otras aplicaciones que consumen recursos aparte de SQL Server, intente detener dichas aplicaciones o considere la posibilidad de ejecutarlas en un servidor independiente. Esto libera memoria de otros procesos para SQL Server.

    • Si configuró la memoria máxima del servidor, aumente la configuración de memoria máxima del servidor.

  • Si sospecha que el administrador de bloqueos usó la cantidad máxima de memoria disponible, identifique la transacción que contiene más bloqueos y la termine. El siguiente script identifica la transacción que tiene más bloqueos:

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

    Tome el identificador de sesión más alto y terminación con el comando KILL .

  • Si usa un valor no predeterminado para locks, use sp_configure para cambiar el valor de locks a su configuración predeterminada mediante la instrucción siguiente:

    EXEC sp_configure 'locks', 0;
    
  • Si encontró el mensaje de error anterior al usar las marcas de seguimiento de SQL Server 1211, 1224 o ambas, revise su uso y deshabilite mientras ejecuta consultas que requieren un gran número de bloqueos. Para obtener más información, consulte DBCC TRACEON - Marcas de seguimiento (Transact-SQL) y Resolución de problemas de bloqueo causados por la extensión de bloqueo en SQL Server.