Teradata: Comment avez-vous debug “Opération Annulée en raison de l'Impasse” erreurs?
Dernièrement, nous avons été faire frapper avec l'erreur Transaction ABORTed due to Deadlock
lorsque nous allons mettre à jour un enregistrement dans l'une de nos tables. Quelque chose est de placer un verrou sur cette table et il n'est pas sorti, mais j'ai passé littérale de travail des jours à essayer de le retrouver et il m'échappe encore.
Alors que l'erreur est aléatoire, je ne sais ce que repetive cycle d'étapes que j'ai besoin de répéter pour la déclencher. Cependant, j'ai interrogé dbc.DBQLogTbl et regarda le SQL a été exécutée 2 minutes avant et après l'erreur se produit et rien ne semble être une sélection dans une table sans un verrouillage d'accès. En outre, après l'erreur se produit, je vous appuyez sur la touche F5 de reposter le formulaire web sur le serveur de répéter exactement le même ensemble de mises à jour et il fonctionne.
Mon intuition est que certains processus à l'extérieur de notre ASP.NET application de verrouillage de la table depuis que j'ai vérifié toutes les instructions SQL est exécuté par notre application. Je pense qu'il doit y avoir un moyen de savoir ce spécifique SQL a été exécutée, qui a placé un verrou sur une table.
8/9/2012 informations Supplémentaires: Toutes les conditions suivantes sont présentes dans cet ordre à l'intérieur de la même transaction en fonction de ce que je vois lors de l'interrogation dbc.DBQLogTbl
et de commande par firststeptime
:
- mise à jour de la table employee
- verrouillage de ligne pour y accéder, sélectionnez * à partir de employeesecurity où empid = X (faire afin d'obtenir un employé à qui le dossier pour voir si quelque chose a changé)
- si il y a un changement, mise à jour susmentionné employeesecurity enregistrement
- mise à jour employeeconfig table (impasse erreur se produit toujours ici)
Je n'ai pas parler de cela avant, mais l'impasse erreur se produit sur un tableau que je ne suis pas de la sélection de tous. Lorsque le chargement de la page, je le fais lire à partir d'une employeeconfig vue, mais locking row for access
est spécifié dans la vue.
Réponse à Rob 4 questions:
- C'est une seule transaction.
- Comme je l'ai dit dans ma dernière mise à jour, la table est verrouillée n'est même pas la table qui est sélectionné à partir d'.
- De toutes les requêtes de l'utilisation
locking row for access
- Nous sommes en sélectionnant à partir de la vue
employeeconfig
. Ce point de vue sélectionne à partir de laemployeeconfig
table à l'aide delocking row for access
. Nous n'utilisons pas delocking row for access
lors de l'interrogation de la vue elle-même.
Pour la gestion de l'impasse, je préfère ne pas avoir le code juste essayer de le renvoyer car cela semble être un problème qui doit être corrigé. Comme vous l'avez dit, Rob, il est possible que mon accès à dbc.DBQLogTbl
est limité, alors peut-être que j'ai juste ne peut pas voir tout ce qui se produit. J'ai été en contact avec l'administrateur et le suivi de nouveau aujourd'hui.
- Je considère que si vous rencontrez une erreur de blocage de votre application tente au moins une fois pour recommencer la transaction abandonné. Est-ce que votre environnement d'utilisation point de Vue? Si oui, êtes-vous autorisé à utiliser avec la molette de fonction de Requête et de Surveiller portlet?
- Oui, nous utilisons point de vue, mais j'ai succombé à essayer de le comprendre. J'essaie d'utiliser l'ID de session-je obtenir à partir de l'interrogation de la dbc.DBQLogTbl, mais point de Vue ne semble jamais trouver. De plus, l'onglet SQL de la requête moniteur est toujours grisé. Est-il un autre moyen de trouver ce que SQL est munie d'un verrou sur une table ou un point de Vue est à peu près la seule option?
- Point de vue serait tout simplement d'aider à identifier les autres sessions qui étaient actifs au moment de la transaction a été annulée. Le SQL ne peut pas être visible en fonction de la portlet autorisations qui ont été définies pour votre rôle de point de Vue. (Voir DBA Équipe.)
- Quel est le niveau de verrouillage qui est appliqué à la " EmployeeConfig table pour l'instruction de mise à jour? Je suis en supposant que vous effectuez une seule ligne de mise à jour et de qualification sur l'Index Primaire.
- Yep, d'une ligne unique de mise à jour sur l'index primaire. Je ne suis pas préciser de verrouillage de la mise à jour. En gros, je suis juste en utilisant
update employeeconfig set field = x where id = y
. - Voir la réponse pour plus de détails sur l'utilisation de la LIGNE de verrouillage EXCLUSIF pour votre instruction de mise à JOUR. Essayer cela et voir si vous pouvez reproduire/éliminer le blocage.
- J'ai essayé avec ma mise à JOUR et j'ai eu
[Teradata Database] [3778] SELECT statement must follow LOCK ROW modifier.
Vous devez vous connecter pour publier un commentaire.
Identifier Les Transactions Abandonnées
La condition de blocage devrait se traduire dans les deux transactions responsable de l'impasse d'être abandonnée. En général, je vois des blocages à l'aide d'Informatica pousser vers le bas de l'optimisation de la tentative de créer des vues temporaires en parallèle et de blocage sur la DBC table(s) requis pour créer les points de vue. Comme votre situation, notre Informatica situation est complètement aléatoire. On peut passer des semaines ou des mois sans un abandon dû à une impasse.
Vous pouvez trouver des transactions suspectes par l'interrogation de la DBQL table du Journal de transactions avec une
ErrorCode = 2631
(Edit: correction d'une erreur de code) etORDER BY StartTime DESC
. Cela vous donnera de chaque transaction a été annulée à cause d'un blocage. La transaction paires qui ont abouti à l'impasse doivent être assez près l'ensemble si ce n'est pas apparié ensemble par le tri.Si votre DBA ont limité les points de vue à l'encontre de l'historique DBQL de données en tout cas, il ne pourrait entraver votre capacité à trouver la cause. Si c'est le cas, vous aurez besoin de travailler avec votre Équipe de DBA à cerner le problème. Il n'est pas rare pour les informations de requête d'être limitée à des développeurs, en raison de l'information qui est contenue dans la Textesql pour une requête donnée. C'est juste quelque chose à envisager de demander si votre recherche ne donne aucun résultat.
Identifier Pourquoi Les Transactions Abandonnées Peuvent Se Produire
Remarque: Cette liste n'est pas exhaustive.
La pire chose à propos de blocage des conditions telles qu'ils se produisent généralement au hasard. La Loi de Murphy stipule que ces occurrences aléatoires auront lieu quand vous dormez, en vacances, ou quelque autre événement où vous ne souhaitez pas être dérangé. Selon votre situation, vous pourriez être en mesure de simplement soumettre de nouveau la transaction(s) qui étaient dans l'impasse.
Vous devez d'abord comprendre comment vous arrivez à la condition de blocage.
ACCESS
ouREAD
de verrouillage?SELECT
déclarations de l'accès à la table grâce à un rapport de 1:1 vue qui emploieROWHASH
ACCESS
de verrouillage permettant ainsi à l'optimiseur de l'escalade de verrouillage de niveau le plus détaillé au niveau requis par la transaction en question? (par exemple,LOCKING ROW FOR ACCESS SELECT * FROM DBC.DBCInfo;
)Manipulation Des Transactions Abandonnées
Selon les circonstances de la situation de blocage que vous pouvez choisir pour votre processus pour tenter de soumettre de nouveau la transaction qui a échoué un nombre prédéterminé de fois. Vous pouvez avoir une situation où un seul processus peut soumettre à nouveau et les autres peuvent avoir à rester dans un état d'échec pour quelqu'un d'autre à vérifier avant de procéder. La première peut être de votre application web et celui-ci peut être un complexe de flux ETL qui ne peut pas être redémarré à l'aveuglette.
Vous devez vous connecter quelque part que cela s'est produit ou pour tout autre mécanisme de présentation de rapports en place pour le suivi de ces incidents.
2631
) et la seule SQL qui est apparu est à l'intérieur de la transaction, je l'ai ouvert. Cependant, je pense que j'ai compris comment déclencher l'erreur, tout simplement pas pourquoi cela arrive. Voir mise à jour de ma réponse.Dans les bases de données relationnelles, les transactions abandonnées ne sont pas des erreurs en soi, mais simplement une demande pour le client de recommencer l'opération depuis le début à cause d'un différent, transaction simultanée peut avoir changé les conditions qui ont déjà été observées par le client émission de la transaction abandonné. Par parfois accepter les transactions à être abandonnée (et rejugée par le client), la base de données relationnelles peuvent apporter d'importantes optimisations de performances, comme en permettant à de nombreuses opérations à exécuter en même temps, même si cela conduit à une petite chance de l'impasse.
Pourquoi ne pas le serveur de base de données réessayer l'opération elle-même, dans ces cas? Parce que le client peut utiliser les données renvoyées par une requête dans la transaction, à l'influence de quels types de mises à jour à faire dans les prochaines mises à jour dans la même transaction. Ainsi, la responsabilité de rejouer les transactions se trouve avec le client dans les rares (mais parfaitement normal et prévu) dans les cas où les transactions sont abandonnées.
Donc la réponse est: les transactions abandonnées sont parfaitement normaux, et vous êtes tout simplement censé réessayer depuis le côté client. Mais comme Rob a noté, cela peut être facile ou difficile selon le type de transaction que vous faites (par exemple, si vous êtes en train de faire 2 heures de ETL processus, vous pouvez comprendre comment réduire la probabilité de blocages à la place).