Condividi tramite


MSSQLSERVER_1204

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureDatabase SQL in Microsoft Fabric

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 Impostare i flag di traccia con DBCC TRACEON e Risolvere i problemi di blocco causati dall'escalation dei blocchi in SQL Server.