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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top