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
, usaresp_configure
per modificare il valore dilocks
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.