Ce sont des raisons communes pour les blocages?
Blocages sont difficiles à trouver et très mal à l'aise à supprimer.
Comment puis-je trouver des sources d'erreur pour les blocages dans mon code? Il n'existe aucun "blocage des modèles"?
Dans mon cas particulier, il traite avec les bases de données, mais cette question est ouverte pour chaque blocage.
- Tu parles de la base de données des blocages ou à propos de l'impasse en C#/Java, etc etc?
- Si c'est de la base de données des blocages, alors que ocdecio dit. Les Tables mises à jour pas à jour dans le même ordre. Parfois, ils se désynchroniser et tout foiré.
- Remarque: il est "l'impasse" pas "dead lock". En un mot.
Vous devez vous connecter pour publier un commentaire.
Mise à jour: Ce récent article de MSDN, Outils Et Techniques pour Identifier les Problèmes de concurrence, pourrait également être d'intérêt
Stephen Toub dans l'article MSDN Le moniteur de blocage membres de l', quatre conditions sont nécessaires pour les blocages de se produire:
Un nombre limité d'une ressource particulière. Dans le cas d'un moniteur en C# (ce que vous utilisez lorsque vous employez le verrouillage de mot-clé), ce nombre limité est un, depuis un moniteur est un organisme de placement-verrou d'exclusion (ce qui signifie qu'un seul thread peut être propriétaire d'un moniteur à un moment).
La capacité de tenir une ressource et demande un autre. En C#, cela s'apparente à de verrouillage sur un objet, puis de verrouillage sur un autre, avant de les libérer de la première écluse, par exemple:
Pas de droit de préemption de la capacité. En C#, cela signifie qu'un thread ne peut pas forcer un autre thread pour libérer un verrou.
Une circulaire condition d'attente. Cela signifie qu'il existe un cycle de fils, chaque de ce qui est en attente de la prochaine libération d'une ressource avant de pouvoir continuer.
Il continue à expliquer que la façon d'éviter les blocages est à éviter (ou à contrecarrer les) condition de quatre.
Le classique de blocage scénario est Un est tenue de verrouillage X et qui veulent acquérir de verrouillage de Y, tandis que B est tenue de verrouillage de Y et qui veulent acquérir de verrouillage de X. Puisque l'un ne peut terminer ce qu'ils essaient de faire les deux sera à la fin de l'attente pour toujours (à moins de délais d'attente sont utilisés).
Dans ce cas, un blocage peut être évité si A et B d'acquérir les verrous dans le même ordre.
Pas de l'impasse, les modèles à ma connaissance (et 12 ans d'écriture fortement multithread applications de négociation).. Mais le TimedLock classe a été d'une grande aide dans la recherche de blocages qui existent dans le code sans une reprise.
http://www.randomtree.org/eric/techblog/archives/2004/10/multithreading_is_hard.html
fondamentalement, (dotnet/c#) vous rechercher/remplacer tous vos "lock(xxx)" les déclarations de "l'utilisation des TimedLock.De verrouillage(xxx)"
Si un blocage est jamais détecté (verrouillage ne peut être obtenu dans le délai spécifié, par défaut à 10 secondes), alors une exception est levée. Ma version locale aussi immédiatement les journaux de la stacktrace. Marcher jusqu'à la stacktrace (de préférence debug avec les numéros de ligne) et vous verrez immédiatement que les serrures ont été détenus au moment de la panne, et dans lequel il a été tentant d'obtenir l'.
Dotnet 1.1, dans une situation de blocage comme décrit, comme par hasard aurait-il tous les threads qui ont été enfermés à jeter l'exception dans le même temps. Donc, si vous voulez obtenir 2+ stacktraces, et toutes les informations nécessaires pour résoudre le problème. (2.0+ ont peut-être changé le modèle de thread en interne assez pour ne pas être cette chance, je ne suis pas sûr)
Faire en sorte que toutes transactions sur les tables dans le même ordre est la clé pour éviter le plus commun de blocages.
Par exemple:
Transaction Un
L'Opération B
Ce qui est extrêmement susceptible d'entraîner un blocage comme Transaction Un obtient un verrou sur la Table A, l'Opération B obtient un verrou sur la table B, donc aucun d'entre eux d'obtenir un verrou pour leur deuxième commande jusqu'à ce que l'autre a fini.
Toutes les autres formes de blocages sont généralement causées par la forte intensité de l'utilisation de SQL Server et du blocage de l'interne, tandis que les ressources allouées.
Oui - des blocages se produisent lorsque les processus d'essayer d'acquérir des ressources dans un ordre aléatoire. Si tous vos processus d'essayer d'acquérir les mêmes ressources dans le même ordre, les possibilités de blocages sont considérablement réduits, si pas totalement éliminé.
Bien sûr, ce n'est pas toujours facile à organiser...
Je recommande la lecture de cet article par Herb Sutter. Il explique les raisons de blocage de questions et met de l'avant un cadre cet article pour s'attaquer à ce problème.
Le scénario typique sont incompatibles mise à jour des plans (tables pas toujours mis à jour dans le même ordre). Cependant, il n'est pas rare d'avoir des blocages lorsque sous haute de traitement de volume.
J'ai tendance à accepter des blocages comme un fait de la vie, il va arriver un jour ou l'autre donc j'ai mon DAL préparés à gérer et réessayez une impasse à cause de l'opération.
Les plus courantes (en fonction de mon non-scientifique des observations) DB impasse scénario est très simple:
Cela peut être évité en précisant "POUR la mise à JOUR de" l'alinéa (ou similaires, en fonction de votre SGBDR) si la lecture est suivie d'une mise à jour. De cette façon, le processus est le verrou exclusif à partir du début, ce qui rend le scénario ci-dessus est impossible.
Une condition qui se déroulent whene deux processus sont chaque en attente pour le othere pour compléter befoure précédent.le résultat est à la fois de la procédure, c'est d'accrocher.
son plus comonelly multitâche et clint/serveur.
Blocage se produit principalement quand il y a dépendantes multiples verrous existent. Dans un thread et un autre thread tente de verrouiller le mutex dans l'ordre inverse se produit. On doit prêter attention à utiliser un mutex pour éviter les blocages.
Assurez-vous de terminer l'opération après la libération du verrou. Si vous avez des verrous multiples, tels que l'accès de la commande est de ABC, libérant ordonnance de ABC.
Dans mon dernier projet, j'ai rencontré un problème de blocages dans une Base de données sql Server. Le problème pour trouver la raison en était que mon logiciel et un logiciel tiers utilisent la même Base de données et travaillent sur les mêmes tables. Il a été très difficile à trouver, ce qui provoque des blocages. J'ai fini par écrire un sql-query de savoir quels processus un sql-États sont à l'origine des blocages. Vous pouvez trouver cette déclaration ici: Les blocages sur SQL-Server
Pour éviter l'impasse dans laquelle il existe un algorithme appelé L'algorithme du banquier.
Ce qui fournit des informations utiles pour éviter un blocage.