Pourquoi les blocages se produisent dans SQL Server?
Donc si je comprends bien, SQL blocages se produisent lorsqu'un SPID est occupé à traiter une autre question et il ne peut pas être pris la peine de courir un autre parce qu'il est tellement occupé en ce moment. Le Serveur SQL "au hasard" choisit une des requêtes à l'impasse des ressources demandées et échoue, la levée d'une exception.
J'ai une application qui s'exécute ~ 40 instances et d'un Service Windows, qui sont toutes les frapper de la même base de données. Je suis à la recherche pour réduire les blocages afin que je puisse augmenter le nombre de threads que je peux fonctionne simultanément.
- Pourquoi ne peut-SQL Serveur vient de mettre en file d'attente de la requête et de l'exécuter quand il a le temps et les ressources disponibles? La plupart de ce que je fais peut attendre quelques secondes sur l'occasion.
- Est-il un moyen de mettre Niveau d'Isolation de Transaction dans le monde entier sans avoir à le spécifier lors de l'apparition de chaque nouvelle connexion/session?
Votre définition de
"Donc, si je comprends bien" ...le reste de ce paragraphe est assez incorrect.
Les blocages n'ont rien à voir avec le serveur étant trop occupé à une requête. Je vous suggérons de reformuler votre question ou aller chercher jusqu'à ce qu'un blocage est vraiment.
Votre compréhension de blocage est mal, mais je pense que vous avez une bonne question.
lmao @heisenberg va JAMBON de retour en 2011...bien tsilb je upvoted votre terriblement mauvaise question. Je veux dire, vraiment, qui ne sait pas ce qu'est une impasse? googles " quelle est l'impasse`
deadlock
n'est pas correct. Normalement SQL Server laisser les autres demandes en attente. Quand il tue une requête, car il détecte une condition de blocage c'est parce que l'ensemble de requêtes ne peut pas terminer (jamais) et un perdant. Je pense que si vous faites un peu de lecture sur ce que les blocages sont, vous serez dans une bien meilleure position pour obtenir la valeur d'une meilleure question"Donc, si je comprends bien" ...le reste de ce paragraphe est assez incorrect.
Les blocages n'ont rien à voir avec le serveur étant trop occupé à une requête. Je vous suggérons de reformuler votre question ou aller chercher jusqu'à ce qu'un blocage est vraiment.
Votre compréhension de blocage est mal, mais je pense que vous avez une bonne question.
lmao @heisenberg va JAMBON de retour en 2011...bien tsilb je upvoted votre terriblement mauvaise question. Je veux dire, vraiment, qui ne sait pas ce qu'est une impasse? googles " quelle est l'impasse`
OriginalL'auteur tsilb | 2011-07-21
Vous devez vous connecter pour publier un commentaire.
Votre compréhension des blocages n'est pas correct. Ce que vous avez décrit, c'est le blocage. C'est une erreur commune à assimiler les deux.
Un blocage se produit lorsque deux transactions distinctes souhaitent différentes ressources, ni libérer celui qu'ils ont pour que les autres puissent s'exécuter. Il est probablement plus facile à illustrer:
SPID #1 obtient un verrou sur Une ressource
SPID #2 obtient un verrou sur la ressource B
SPID #1 a maintenant besoin d'un verrou sur la ressource B afin de compléter
SPID #2 a maintenant besoin d'un verrou sur Une ressource afin de compléter
SPID #1 ne peut pas complet (et donc la libération des ressources A) parce que SPID #2 a
SPID #2 ne peut pas complet (et donc la libération de la ressource B) parce que SPID #1 a
Puisque ni SPID peut compléter l'on a à donner (c'est à dire être choisi par le serveur comme victime du blocage) et va échouer.
La meilleure façon de les éviter est de garder vos transactions de petite taille (en nombre de ressources nécessaires) et rapide.
rollback
). Aucun montant de l'attente, de la mémoire, les disques, etc. peut aiderLe Spid en question ne sont même pas en cours d'exécution correcte des opérations; simple CRUD états seulement. Dois-je le préciser non validées sur chacun d'eux? En général, mes app permettra d'ouvrir et de fermer une connexion pour chaque instruction/de requête, à moins qu'il ait à faire un tas dans une rangée. Mais ils s'additionnent sur les threads n et x des utilisateurs. Chaque instruction/de requête (de ceux qui sont dans l'impasse) prend seulement environ 50-200ms à exécuter.
vous pouvez trouver ce
aba_lockinfo
utilitaire très utiledans SQL server toutes les CRUD instruction est exécutée dans une transaction. Cette opération peut être implicite ou explicite, mais il existe toujours.
Que queestion est plus compliqué qu'il n'y paraît au premier coup d'œil. Comme Tom H. l'indique, vous voudrez peut-être rechercher les blocages et aussi pour les "niveaux d'isolement". Très brièvement, vous ne pouvez pas le dire pour ne pas prendre de verrouillage pour les commandes qui changent les données, mais vous pouvez le dire sur les opérations de lecture à lire grâce à une serrure à l'aide des choses comme "Avec NOLOCK" indicateur de requête. Mais cela vient avec des risques et doivent être utilisés avec beaucoup de prudence.
OriginalL'auteur Tom H
De blocage est là que deux threads de traitement sont à la fois d'être soutenu par les autres ( ça peut être plus, mais deux, c'est assez complexe ). Si un thread verrouille une table, puis demande un verrou sur une autre table. l'autre tableau est verrouillé par le deuxième thread, qui ne peut pas progresser car il est en attente d'un verrou sur la première table.
La raison que l'un de ces qui doit être jeté dans une impasse, ils n'auront jamais de fin ni de thread peut évoluer à tous. La seule réponse est pour le seul à être arrêté pour permettre aux autres de compléter.
La solution pour réduire les blocages dans le genre de situation dont vous parlez, peut-être à la refonte de la solution. Si vous pouvez faire en sorte que moins de verrouillage se produit, vous aurez moins de blocages.
OriginalL'auteur Schroedingers Cat
Les blocages se produit parce que, deux transactions concurrentes peuvent se chevaucher e de verrouillage de différentes ressources, à la fois requis par les autres transactions à terminer.
Imaginons:
1 - Opération verrous row1
2 - l'Opération B serrures row2
3 - l'Opération est Une tente de verrouiller row1, et, à cause de la précédente serrure, SQL server attend
4 - Opération B tente de verrouiller row2, et, à cause de la précédente serrure, SQL server attend
Donc, SQL server doit choisir de la transaction, le tuer, et laisser les autres continuer.
Cette image ilustrates cette situation très bien: http://www.eupodiatamatando.com/wp-content/uploads/2008/01/deadlocknajkcomafarialibh3.jpg
OriginalL'auteur Adilson de Almeida Jr