En évitant de blocage en utilisant l'indicateur NOLOCK
De temps en temps je reçois des message d'erreur suivant dans la production de l'environnement qui s'en va sur l'exécution de la même procédure stockée à nouveau.
Transaction (ID de Processus 86) a été bloquée sur les ressources par un autre processus et a été choisie comme victime. Exécutez à nouveau l'opération
Quelqu'un m'a dit que si j'utilise l'indicateur NOLOCK dans mes procédures stockées, il fera en sorte qu'il ne sera jamais dans l'impasse. Est-ce correct? Sont-il de meilleures façons de gestion de cette erreur?
OriginalL'auteur Silverlight Student | 2011-07-08
Vous devez vous connecter pour publier un commentaire.
Occasionnel des blocages sur un SGBDR qui verrouille comme SQL Server/Sybase sont attendus.
Vous pouvez de code sur le client pour recommencer comme l'a recommandé mon MSDN "gestion des Blocages".
Fondamentalement, examiner la SQLException et peut-être une demi-seconde plus tard, d'essayer de nouveau.
Sinon, vous devriez réviser votre code de façon à ce que tous les accès aux tables sont dans le même ordre. Ou vous pouvez utiliser un ENSEMBLE DEADLOCK_PRIORITY de contrôle qui devient une victime.
Sur MSDN pour SQL Server, il est "La Réduction Des Blocages" qui commence
Ce mentionne aussi "un faible Niveau d'Isolement" que je n'aime pas (de même que pour de nombreux types SQL ici) et est à votre question. Ne pas le faire c'est de la réponse... 🙂
Remarque: MVCC type de SGBD (Oracle, Postgres) n'ont pas ce problème. Voir http://en.wikipedia.org/wiki/ACID#Locking_vs_multiversioning mais MVCC a d'autres questions.
OriginalL'auteur gbn
Tout en ajoutant NOLOCK peut empêcher les lecteurs et les écrivains de bloquer les uns les autres (jamais l'esprit de tous les effets secondaires négatifs qu'il a), il n'est pas magique correctif pour les blocages. De nombreux blocages n'ont rien à voir avec la lecture des données, de sorte que l'application de NOLOCK à vos requêtes de lecture peut ne pas causer rien changer du tout. Avez-vous exécuter une trace et a examiné le graphique de blocage pour voir exactement ce que le blocage est? Cela devrait au moins vous permettre de savoir quelle partie du code à regarder. Par exemple, la procédure stockée de blocage, car il est appelé par plusieurs utilisateurs en même temps, ou est-il de l'interblocage avec un autre morceau de code?
Compris. Cependant, mon point était juste qu'un auteur peut être bloquée en attente d'un lecteur pour terminer le niveau d'isolation par défaut. (Désolé, ce n'était pas sûr de savoir si vous étiez confirme ce que je disais, ou de contestation. :-))
Juste une réaction réflexe à l'utilisation de "NOLOCK" et "magique fix" dans le même paragraphe. J'étais certain que tu savais comment ça fonctionnait, j'essayais juste à la tête de la perception erronée que NOLOCK peut être utilisé pour garder les insertions et mises à jour de bloatin fichiers du journal des transactions.
OriginalL'auteur Aaron Bertrand
Voici un bon lien pour apprendre à résoudre les blocages. J'essaie toujours d'éviter à l'aide de nolock pour les raisons ci-dessus. Vous pouvez aussi mieux comprendre Compatibilité De Verrouillage.
OriginalL'auteur null_pointer