Come posso annullare una richiesta di blocco app in SQL Server?


25

La procedura memorizzata sp_getapplock ha i seguenti valori restituiti:

0: il blocco è stato concesso correttamente in modo sincrono.
1: il blocco è stato concesso correttamente dopo aver atteso il rilascio di altri blocchi incompatibili.
-1: la richiesta di blocco è scaduta.
-2: la richiesta di blocco è stata annullata.
-3: La richiesta di blocco è stata scelta come vittima di un deadlock.
-999: indica una convalida dei parametri o un altro errore di chiamata.

Sto scrivendo un wrapper per la chiamata sp_getapplocknel nostro livello di accesso ai dati e voglio sapere in quali circostanze -2 può essere restituito in modo da poter generare un'eccezione descrittiva e utile. È ovvio cosa significano i valori di ritorno di -1 e -3 e posso facilmente creare condizioni di prova che causano la restituzione di quei valori. Come potrei ottenere un valore di ritorno di -2?

Risposte:


5

Osservando l'origine del sp_getapplockproc wrapper, tutti i valori di ritorno tranne -999 provengono dalla sys.xp_userlock stored procedure interna sottostante . Scommetto che il proc interno restituisce un -2 quando la richiesta viene annullata da un evento di attenzione (timeout della query del client o annullamento della query del client esplicito). Tuttavia, nessun ulteriore sp_getapplockcodice viene eseguito dopo l'annullamento del batch, inclusa l' RETURNistruzione. Di conseguenza, il codice di ritorno -2 può essere restituito internamente ma non esiste un modo pratico per ottenere il valore dal client.

Supponendo che questa teoria sia corretta, non c'è alcun valore nel tradurre -2 in un messaggio più descrittivo poiché è il client che ha annullato la richiesta in primo luogo.

Lascio a Paul la conferma confermando il codice del motore di database SQL con un debugger :-)


1

sp_getapplock crea blocchi su semafori, non su oggetti fisici (per MSDN). Bloccherà un altro processo solo se è sp_getapplock con la stessa stringa e una modalità di blocco incompatibile.

Quindi le richieste di blocco sarebbero annullate in circostanze come: un utente con privilegi più alti annulla il blocco, un processo del server annulla il blocco, l'utente che esegue la procedura memorizzata o un amministratore interrompe il processo di blocco. La tua descrizione potrebbe essere "blocco annullato dal sistema o da un altro utente". Non sono sicuro di come determinare il processo / utente effettivo che ha annullato il blocco.


-1

Esiste una procedura memorizzata per il blocco dell'applicazione Release corrispondente chiamata sp_releaseapplock.

Ho scritto un articolo confuso dal titolo "Mutex in SQL" qui su SQL Server Central sull'utilizzo di queste stored procedure per controllare il flusso delle applicazioni.


4
Sembra che tu stia rispondendo alla domanda nel titolo, ma la vera domanda è "In quali circostanze sp_getapplock restituirà -2?"
Martin Smith,

Richiesta di blocco annullata. Anzi, è strano. In che modo il processo annullerebbe la propria richiesta di blocco senza sapere che è stato annullato! Potrebbe essere necessario accettare che non è possibile fornire un errore significativo diverso da quello fornito da MS - "Richiesta di blocco annullata".
Toby,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.