web-dev-qa-db-fra.com

ORA-00060: blocage détecté lors de l'attente de la ressource

J'ai une série de scripts fonctionnant en parallèle en tant que Nohup sur un serveur AIX hébergeant Oracle 10g. Ces scripts sont écrits par quelqu'un d'autre et sont destinés à être exécutés simultanément. Tous les scripts effectuent des mises à jour sur une table. Je reçois l'erreur,

ORA-00060: blocage détecté lors de l'attente de la ressource

En cherchant sur Google, j'ai trouvé: http://www.dba-Oracle.com/t_deadly_perpetual_embrace_locks.htm

Même si les scripts effectuent la mise à jour sur la même table simultanément, ils effectuent des mises à jour sur différents enregistrements de la table déterminés par la clause WHERE sans chevauchement d'enregistrements entre eux.

Cela aurait-il donc causé l'erreur?.

Cette erreur se produira-t-elle quel que soit l'endroit où les mises à jour sont effectuées sur une table?.

Dois-je éviter à tout moment les mises à jour simultanées sur une table?.

Étrangement, j'ai également trouvé sur le journal Nohup.out, PL/SQL successfully completed après l'erreur citée ci-dessus.

Cela signifie-t-il qu'Oracle a récupéré de l'impasse et terminé les mises à jour avec succès ou dois-je réexécuter ces scripts en série? Toute aide serait la bienvenue.

Merci d'avance.

21
wowrt

Vous pouvez obtenir des interblocages sur plus que de simples verrous de ligne, par exemple voir ceci . Les scripts peuvent être en concurrence pour d'autres ressources, telles que des blocs d'index.

J'ai contourné cela dans le passé en concevant le parallélisme de telle manière que différentes instances travaillent sur des parties de la charge de travail qui sont moins susceptibles d'affecter des blocs proches les uns des autres; par exemple, pour une mise à jour d'une grande table, au lieu de configurer les esclaves parallèles en utilisant quelque chose comme MOD(n,10), j'utiliserais TRUNC(n/10) ce qui signifie que chaque esclave a travaillé sur un ensemble contigu des données.

Il existe, bien sûr, de bien meilleures façons de diviser un travail pour le parallélisme, par exemple DBMS_PARALLEL_EXECUTE .

Vous ne savez pas pourquoi vous obtenez "PL/SQL terminé avec succès", peut-être que vos scripts gèrent l'exception?

11
Jeffrey Kemp

Je me débattais récemment avec un problème similaire. Il s'est avéré que la base de données manquait d'index sur les clés étrangères. Cela a obligé Oracle à verrouiller beaucoup plus d'enregistrements que nécessaire, ce qui a rapidement conduit à un blocage lors d'une concurrence élevée.

Voici un excellent article avec beaucoup de bons détails, suggestions et détails sur la façon de résoudre un blocage: http://www.oratechinfo.co.uk/deadlocks.html#unindex_fk

29
benvolioT

J'ai également rencontré ce problème. Je ne connais pas les détails techniques de ce qui se passait réellement. Cependant, dans ma situation , la cause principale était qu'il y avait une configuration de suppression en cascade dans la base de données Oracle et mon code JPA/Hibernate essayait également de faire les appels de suppression en cascade. Mon conseil est donc de vous assurer que vous savez exactement ce qui se passe.

3
DaShaun

Je testais une fonction qui avait plusieurs instructions UPDATE dans IF-ELSE blocs.

Je testais tous les chemins possibles, j'ai donc réinitialisé les tables à leurs valeurs précédentes avec les instructions 'manual' UPDATE à chaque fois avant de relancer la fonction.

J'ai remarqué que le problème se produirait juste après ces instructions UPDATE;

J'ai ajouté un COMMIT; après l'instruction UPDATE que j'avais l'habitude de réinitialiser les tables et qui a résolu le problème.

Donc, attention, le problème n'était pas la fonction elle-même ...

1
Daniel Segura