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 la employeeconfig table à l'aide de locking row for access. Nous n'utilisons pas de locking 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.