10
votes

Oracle Update est suspendue

J'ai des problèmes avec une mise à jour Oracle. L'appel à exécutenonquery est suspendu indéfiniment.

Le code: xxx

CommandTimeOut est défini sur 5, et les paramètres sont définis sur de petites valeurs entières.

La requête: xxx

La requête fonctionne rapidement de SQLPlus et fonctionne normalement rapidement de mon code, mais de temps en temps, il se bloque pour toujours.

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.

Il y a deux choses que je voudrais Aimez-vous savoir: Qu'est-ce qui pourrait causer la mise à jour?

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.


1 commentaires

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?


6 Réponses :


6
votes

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.

Vous devez sélectionner ... Pour Mettre à jour la NOWAIT avant de mettre à jour si vous ne voulez pas vous suspendre indéfiniment.


0 commentaires

0
votes

On dirait que la base de données attend un commit / Rollback afin qu'il verrouille la ligne. Je suggérerais d'ajouter xxx


0 commentaires

2
votes

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.


0 commentaires

24
votes

Je chante cela en raison de son classement de page dans les résultats de la recherche.

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.

En validant la mise à jour SQLPLUS résolue le problème.


7 commentaires

exactement ce qui me est arrivé. Dès que j'ai exécuté Rollback 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.



1
votes

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> xxx pré>

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


0 commentaires

4
votes

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 :

Premier, Ouvrez SQLPlus et faites-vous engager de résoudre le problème.

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.

Vous pouvez modifier votre code à quelque chose comme ceci: xxx


0 commentaires