ASP classico: l'oggetto globale "Applicazione" può causare dead lock?
-
10-07-2019 - |
Domanda
In ASP classico esiste un oggetto globale chiamato " Applicazione " a cui si accede contemporaneamente da tutte le sessioni.
Come l'applicazione " L'oggetto è una risorsa condivisa, può causare blocchi morti?
MODIFICA: In caso contrario, perché ha i metodi blocco e sblocco ? Riferimento
Soluzione
Deadlock è diverso dal normale blocco . Poiché le pagine vengono elaborate in thread diversi, se si desidera impedire a un'altra richiesta di modificare quella risorsa condivisa, si utilizza Blocca e per consentire nuovamente la modifica, si utilizza il metodo Unlock. Il fatto è che se non si utilizzano questi metodi, un'altra richiesta può modificare il valore di un elemento nello stato dell'applicazione, mentre si fa affidamento su un vecchio valore . Oppure due richieste possono provare a modificarlo contemporaneamente e potrebbe causare problemi. Il metodo di blocco fa attendere una richiesta fino a quando l'altra richiesta sblocca l'applicazione; dopo ciò, può continuare.
Deadlock è una situazione in cui thread A blocca risorsa 1 e attende per risorsa 2 per diventare disponibile. Allo stesso tempo, thread B , che ha bloccato risorsa 2 deve accedere a risorsa 1 (che è bloccato da thread A ) per continuare a lavorare ed essere in grado di rilasciare la risorsa in seguito. In questa situazione, nessuno dei thread può continuare (uno di essi deve essere terminato per consentire la continuazione). Questo è un deadlock . Application.Lock non provoca deadlock da solo se utilizzato correttamente. Ma se non viene utilizzato correttamente, potrebbe causare deadlock (se associato a un'altra risorsa condivisa che richiede il blocco e i deadlock non vengono risolti).
Altri suggerimenti
È improbabile che il blocco dell'oggetto ASP Applicazione
comporti un deadlock più lungo dell'impostazione di timeout dello script del server.
Il classico oggetto ASP Applicazione
ha Blocco e Sblocco per sincronizzare le modifiche agli oggetti Applicazione. Puoi avere più richieste che tentano di apportare una modifica allo stesso valore - senza bloccare, apportare la modifica e sbloccare la modifica potrebbe andare persa.
Come semplice esempio sarebbe un contatore di qualche tipo. Supponiamo che il tuo codice faccia:
<%
Application("Count") = Application("Count") + 1
%>
Se hai due richieste simultanee (req1 e req2), potresti " perdere " un hit di pagina - effettivamente un "aggiornamento mancante".
Puoi impedirlo bloccando la variabile Applicazione
prima di aggiornarla e sbloccarla dopo l'aggiornamento:
<%
Application.Lock
Application("Count") = Application("Count") + 1
Application.Unlock
%>
Se Applicazione
è bloccato mentre un altro thread di richiesta tenta di accedervi, il thread si bloccherà fino al rilascio del blocco o al superamento del timeout dello script.
Se si dimentica di sbloccare un blocco, questo verrà rilasciato automaticamente dopo l'elaborazione della pagina o dopo il superamento del timeout dello script.
Per ulteriori informazioni, vedi MSDN .
No, non si blocca mai.
Un deadlock è una situazione in cui due o più azioni in competizione stanno aspettando che l'altro finisca, e quindi nemmeno mai.