Поделиться через


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 (Transact-SQL) в нединамическую, нединамическую.

  • Вы включили флаги трассировки 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.