ASP classique: l’application peut & # 8220; Application & # 8221; objet global provoquer un blocage?

StackOverflow https://stackoverflow.com/questions/313998

  •  10-07-2019
  •  | 
  •  

Question

Dans les ASP classiques , un objet global appelé "Application" est accessible simultanément par toutes les sessions.

En tant qu’application " Application " objet est une ressource partagée, peut-il provoquer des verrous mortels?

MODIFIER: si ce n’est pas le cas, pourquoi existe-t-il des méthodes de verrouillage et de déverrouillage ? Référence

Était-ce utile?

La solution

Le blocage est différent du blocage normal . Étant donné que les pages sont traitées dans différents threads, si vous souhaitez empêcher une autre demande de modifier cette ressource partagée, utilisez Verrou, et pour autoriser la modification à nouveau, utilisez la méthode Unlock. Si vous n'utilisez pas ces méthodes, une autre requête peut modifier la valeur d'un élément dans l'état de l'application, lorsque vous vous basez sur une ancienne valeur . Ou deux demandes peuvent essayer de le modifier simultanément et cela pourrait causer des problèmes. La méthode de verrouillage force une demande à attendre que l'autre demande déverrouille l'application; après cela, ça peut continuer.

Le blocage est une situation dans laquelle le thread A verrouille la ressource 1 et attend la ressource 2. être disponible. En même temps, thread B , qui a verrouillé la ressource 2 doit accéder à la ressource 1 (qui est verrouillée par thread A ) pour continuer à travailler et pouvoir libérer la ressource par la suite. Dans cette situation, aucun des threads ne peut continuer (l'un d'entre eux doit être terminé pour permettre la poursuite). Ceci est un impasse . Application.Lock ne provoquera pas à lui seul des blocages s'il est utilisé correctement. Mais s’il n’est pas utilisé correctement, cela peut entraîner des blocages (associé à une autre ressource partagée nécessitant un verrouillage, les blocages ne sont pas résolus).

Autres conseils

Il est peu probable que le verrouillage de l'objet ASP Application entraîne un blocage qui dure plus longtemps que le paramètre de délai d'expiration du script du serveur.

L'objet ASP Application classique ASP dispose des fonctions Verrouiller et Déverrouiller pour la synchronisation des modifications apportées aux objets Application. Vous pouvez avoir plusieurs requêtes essayant d’apporter une modification à la même valeur - sans verrouiller, la modification puis le déverrouillage de la modification pourraient être perdus.

Un exemple simple serait un compteur de quelque sorte. Disons que votre code fait:

<%
Application("Count") = Application("Count") + 1
%>

Si vous avez deux demandes simultanées (req1 et req2), vous pouvez "perdre". une page consultée - en réalité, une "mise à jour manquante".

Vous pouvez éviter cela en verrouillant la variable Application avant de la mettre à jour et en la déverrouillant après la mise à jour:

<%
Application.Lock
Application("Count") = Application("Count") + 1
Application.Unlock
%>

Si Application est verrouillé alors qu'un autre thread de requête tente d'y accéder, le thread restera bloqué jusqu'à ce que le verrou soit libéré ou que le délai d'attente du script soit dépassé.

Si vous oubliez de déverrouiller un verrou, il sera automatiquement relâché après le traitement de la page ou après le dépassement du délai d'attente du script.

Pour plus d'informations, voir MSDN .

Non, il ne bloque jamais.

Une impasse est une situation dans laquelle deux ou plusieurs actions concurrentes attendent la fin de l’autre, et donc jamais plus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top