Condividi tramite


Personalizzazione del timeout del blocco

Quando un'istanza di Microsoft Motore di database di SQL Server non può assegnare un blocco a una transazione poiché un'altra transazione è già proprietaria di un blocco in conflitto nella risorsa, la prima transazione viene bloccata in attesa del rilascio del blocco esistente. Per impostazione predefinita, non è previsto alcun intervallo di timeout obbligatorio e non è disponibile alcun metodo per verificare se, prima dell'applicazione di un blocco, una risorsa è bloccata. L'unica situazione rilevabile è il tentativo di accesso ai dati con il potenziale rischio di attivazione di un blocco per un tempo indeterminato.

[!NOTA] In SQL Server 2005 utilizzare la vista a gestione dinamica sys.dm_os_waiting_tasks per determinare se un processo sia bloccato e quale sia l'origine del blocco. Nelle versioni precedenti di SQL Server utilizzare la stored procedure di sistema sp_who.

Tramite l'impostazione LOCK_TIMEOUT è possibile specificare il periodo di attesa massimo delle istruzioni per una risorsa bloccata. Quando il periodo di attesa di un'istruzione supera il valore massimo impostato nell'opzione LOCK_TIMEOUT, l'istruzione bloccata viene annullata automaticamente e nell'applicazione viene restituito il messaggio di errore 1222 (Lock request time-out period exceeded). Qualsiasi transazione contenente l'istruzione, tuttavia, non viene sottoposta a rollback o annullata tramite SQL Server. È pertanto necessario che nell'applicazione sia disponibile un gestore degli errori in grado di intercettare il messaggio di errore 1222. Se questo errore non viene intercettato, l'applicazione continua ad essere eseguita come se l'istruzione della transazione non fosse stata annullata. In questo caso possono verificarsi errori, in quanto le istruzioni successive della transazione potrebbero dipendere da quella che non è mai stata eseguita.

Mediante l'implementazione di un gestore degli errori in grado di intercettare il messaggio di errore 1222, è possibile gestire la condizione di timeout ed eseguire gli interventi di correzione necessari, ad esempio la riesecuzione automatica dell'istruzione che è stata bloccata oppure il rollback dell'intera transazione.

Per determinare l'impostazione corrente di LOCK_TIMEOUT, eseguire la funzione @@LOCK_TIMEOUT:

SELECT @@lock_timeout;
GO

Vedere anche

Concetti

Gestione degli errori e dei messaggi nelle applicazioni

Altre risorse

@@LOCK_TIMEOUT (Transact-SQL)
SET LOCK_TIMEOUT (Transact-SQL)
sp_who (Transact-SQL)
sys.dm_os_waiting_tasks

Guida in linea e informazioni

Assistenza su SQL Server 2005