Condividi tramite


MSSQLSERVER_1204

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure

Dettagli

Attributo valore
Nome prodotto SQL Server
ID evento 1204
Origine evento MSSQLSERVER
Componente SQLEngine
Nome simbolico LK_OUTOF
Testo del messaggio In questo momento l'istanza del Motore di database di SQL Server non è in grado di ottenere una risorsa LOCK. Eseguire nuovamente l'istruzione quando è presente un minor numero di utenti attivi. Chiedere all'amministratore del database di controllare la configurazione di memoria e di blocco per l'istanza o di verificare la presenza di transazioni con esecuzione prolungata.

Spiegazione

Durante l'esecuzione, le query acquisiscono e rilasciano spesso blocchi sulle risorse a cui accedono. L'acquisizione di un blocco utilizza le strutture di blocco da un pool disponibile di queste strutture Quando non è possibile acquisire nuovi blocchi perché nel pool non sono disponibili altre strutture di blocco, viene emesso il messaggio di errore 1204. Questo problema può essere dovuto a uno dei motivi seguenti:

  • SQL Server non può allocare più memoria, perché altri processi lo usano o perché SQL Server ha usato tutta la memoria e ha raggiunto il valore configurato usando l'opzione di configurazione max server memory.

  • Gestione blocchi non può usare più del 60% della memoria disponibile per SQL Server e la soglia è già stata raggiunta.

  • È possibile configurare i blocchi delle opzioni di configurazione della stored procedure di sistema sp_configure (Transact-SQL) su un valore non dinamico e non predefinito.

  • Sono stati abilitati flag di traccia 1211, 1224 o entrambi in SQL Server per controllare il comportamento di escalation dei blocchi e si eseguono query che richiedono molti blocchi.

Azione utente

  • Se si sospetta che SQL Server non possa allocare memoria sufficiente, provare le opzioni seguenti:

    • Identificare se un altro clerk di memoria all'interno di SQL Server ha usato una grande parte della memoria configurata di SQL Server usando una query simile alla seguente:

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

      Ridurre quindi il consumo di memoria di tale clerk di memoria per consentire la memoria di blocco in modo da usare più risorse. Per altre informazioni, vedere Risolvere i problemi di memoria insufficiente o insufficiente in SQL Server.

    • Se le risorse vengono utilizzate da altre applicazioni oltre a SQL Server, provare ad arrestarne l'esecuzione o a eseguirle in un server distinto. In questo modo viene rilasciata la memoria da altri processi per SQL Server.

    • Se è stata configurata la memoria massima del server, aumentare l'impostazione max server memory .

  • Se si sospetta che il gestore blocchi abbia usato la quantità massima di memoria disponibile, identificare la transazione che contiene il maggior numero di blocchi e terminarla. Lo script seguente identifica la transazione con il maggior numero di blocchi:

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

    Accettare l'ID sessione più alto e terminarlo usando il comando KILL .

  • Se si usa un valore non predefinito per locks, usare sp_configure per modificare il valore di locks impostandone l'impostazione predefinita usando l'istruzione seguente:

    EXEC sp_configure 'locks', 0;
    
  • Se si verifica il messaggio di errore precedente quando si usano i flag di traccia di SQL Server 1211, 1224 o entrambi, esaminare l'uso e disabilitarli durante l'esecuzione di query che richiedono un numero elevato di blocchi. Per altre informazioni, vedere DBCC TRACEON - Flag di traccia (Transact-SQL) e Risolvere i problemi di blocco causati dall'escalation dei blocchi in SQL Server.