MSSQLSERVER_1204

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Сведения

Атрибут Значение
Название продукта SQL Server
ИД события 1204
Источник событий MSSQLSERVER
Компонент SQLEngine
Символическое имя LK_OUTOF
Текст сообщения Экземпляру компонента SQL Server Database Engine не удается получить ресурс LOCK в данный момент времени. Запустите инструкцию повторно, когда число активных пользователей уменьшится. Попросите администратора баз данных проверить конфигурацию блокировки и памяти для данного экземпляра либо выполнить проверку давно выполняющихся транзакций.

Описание

Во время выполнения запросы часто получают доступ к ресурсам и снимают блокировку доступа к ним. Получение блокировки использует структуры блокировки из доступного пула структур блокировки. Если новые блокировки не удается получить, так как в пуле нет дополнительных структур блокировки, возвращается сообщение об ошибке 1204. Эта проблема может быть вызвана любой из следующих причин:

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

  • Диспетчер блокировки не будет использовать более 60 процентов памяти, доступной для SQL Server, и пороговое значение уже выполнено.

  • Вы настроили блокировки параметров конфигурации системной хранимой процедуры sp_configure в нединамичное значение, отличное от по умолчанию.

  • Вы включили флаги трассировки 1211, 1224 или обоих в SQL Server для управления поведением эскалации блокировки, и выполняете запросы, для которых требуется много блокировок.

Действие пользователя

  • Если вы подозреваете, что SQL Server не может выделить достаточно памяти, попробуйте следующее:

    • Определите, использовал ли любой другой клерк памяти в SQL Server большую часть настроенной памяти SQL Server с помощью запроса, например:

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

      Затем уменьшите потребление памяти для этого клерка памяти, чтобы разрешить блокировке памяти использовать больше ресурсов. Дополнительные сведения см. в статье об устранении неполадок с нехваткой памяти или нехваткой памяти в SQL Server.

    • Если другие приложения, кроме SQL Server, используют ресурсы, попытайтесь закрыть эти приложения или запустите их на отдельном сервере. Это позволит освободить память от других процессов для SQL Server.

    • Если вы настроили максимальную память сервера, увеличьте максимальный параметр памяти сервера.

  • Если есть подозрения, что диспетчер блокировок использовал максимальное количество свободной памяти, определите, какая транзакция удерживает больше всего блокировок, и завершите ее работу. Следующий скрипт определяет транзакцию, которая имеет большинство блокировок:

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

    Возьмите идентификатор сеанса с наивысшим значением и завершите его с помощью команды KILL .

  • Если вы используете значение locks, отличное от по умолчанию, используйте sp_configure для изменения значения locks его параметра по умолчанию с помощью следующей инструкции:

    EXEC sp_configure 'locks', 0
    
  • Если при использовании флагов трассировки SQL Server 1211, 1224 или обоих, проверьте их использование и отключите при выполнении запросов, требующих большого количества блокировок. Дополнительные сведения см. в статье DBCC TRACEON — флаги трассировки (Transact-SQL) и устранение проблем блокировки, вызванных эскалацией блокировки в SQL Server.