J'ai des problèmes avec une mise à jour Oracle. L'appel à exécutenonquery est suspendu indéfiniment.
Le code: p> CommandTimeOut est défini sur 5, et les paramètres sont définis sur de petites valeurs entières. P> La requête: p> La requête fonctionne rapidement de SQLPlus et fonctionne normalement rapidement de mon code, mais de temps en temps, il se bloque pour toujours. p> J'ai couru une requête sur v $ verrouillée_Object, et il y a un enregistrement faisant référence à ce tableau, mais je pense que c'est la mise à jour qui ne complète pas. P> Il y a deux choses que je voudrais Aimez-vous savoir: Qu'est-ce qui pourrait causer la mise à jour? P> Plus important encore, pourquoi une exception n'est-elle pas lancée ici? Je m'attendrais à ce que l'appel soit attendu cinq secondes, puis délai d'attente. P> p>
6 Réponses :
Lorsqu'une mise à jour simple est suspendue signifie souvent que vous êtes bloqué par une autre session. Oracle n'autorisera pas plus d'une transaction de mettre à jour une ligne. Jusqu'à ce que la transaction ait été commise ou renvoyée ses modifications, elle verrouille les lignes qu'il a mis à jour / supprimé. Cela signifie que d'autres sessions devront attendre s'ils veulent modifier les mêmes lignes. P>
Vous devez sélectionner ... Pour Mettre à jour la NOWAIT avant de mettre à jour si vous ne voulez pas vous suspendre indéfiniment. P>
On dirait que la base de données attend un commit / Rollback afin qu'il verrouille la ligne. Je suggérerais d'ajouter
Vous pouvez voir quel événement votre session attend votre session en requête v $ session_wait (après avoir identifié le SID de la session, probablement en regardant V $ Session). Si l'événement est quelque chose comme "Enqueue", vous attendez une serrure détenue par une autre session, qui semble une explication probable dans ce cas. P>
Je chante cela en raison de son classement de page dans les résultats de la recherche. P>
Dans mon cas, c'était parce que j'avais exécuté une requête à Sqlplus, mais j'ai oublié de l'engager. Dans ce cas, c'était comme Vincent indiqué: la ligne a été verrouillée dans une autre session. P>
En validant la mise à jour SQLPLUS résolue le problème. P>
exactement ce qui me est arrivé. Dès que j'ai exécuté Rollback code> dans SQLPlus, il est retourné.
Lifesaver - 4 ans plus tard!
Dans mon cas, j'utilisais le développeur Oracle SQL et après la commission que cela a fonctionné!
Je faisais la même chose. Merci!
Mère #) # $, ça m'est arrivé aussi.
Dans mon cas, j'ai laissé une déclaration de mise à jour sur une table ouverte sans commit. Ensuite, je mettais à jour le même record via l'application et l'exécutenonquery n'est jamais revenu. Commettre la déclaration de mise à jour originale dans le développeur SQL a fait le tour
9 ans plus tard et c'est toujours une réponse utile ... je viens de m'a sauvé beaucoup de têtes.
J'ai fréquemment rencontré ce problème et avec plus que des requêtes de mise à jour (notamment "insertion dans ... Sélectionnez" Queries). Ceci est sur Oracle 9i.
J'ai trouvé la solution, alors décidé de trouver ce sujet associé:
Dans la chaîne de connexions, réglez: p> dans la chaîne de connexion.
Une chaîne de connexion complet et de travail peut ressembler à: p> DATA SOURCE=k19.MYDOMAIN.com/plldb;PERSIST SECURITY INFO=True;Pooling=False;USER ID=IT;Password=SECRET
J'avais un problème similaire causé par un commandement SQL qui n'avait pas été commis - je suppose que le programme s'est écrasé au milieu de l'un à un moment donné.
Voici comment j'ai corrigé mon problème : P>
Premier, Ouvrez SQLPlus et faites-vous engager de résoudre le problème. P>
Ensuite, modifiez le code pour commettre la transaction ou la restauration si une exception se produit. Cela gardera le problème de se produire à nouveau. P>
Vous pouvez modifier votre code à quelque chose comme ceci: p>
Quelle version de Oracle? Vous pouvez exécuter cette requête: "Select * de V $ version" et une ligne de copie 1. Il devrait ressembler à quelque chose comme: "Base de données Oracle 10g version 10.2.0.4.0 - Production". En outre, est-ce une vraie table ou une vue avec des déclencheurs? A-t-il des déclencheurs avant / après?