Personalizzazione del timeout del blocco

Quando un'istanza di MicrosoftMotore 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, utilizzare la vista a gestione dinamica sys.dm_os_waiting_tasks per determinare se un processo sia stato bloccato e quale sia l'origine del blocco. Nelle versioni precedenti di SQL Server, utilizzare la stored procedure di sistema sp_who.

L'impostazione LOCK_TIMEOUT consente a un'applicazione di definire il periodo di tempo massimo durante il quale un'istruzione rimane in attesa di 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, l'applicazione deve avere un gestore degli errori in grado di intercettare il messaggio di errore 1222. Se questo errore non viene intercettato, l'applicazione continua a 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 bloccata oppure il rollback dell'intera transazione.

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

SELECT @@lock_timeout;
GO