2010-06-19 6 views
17

Ich habe eine Reihe von Skripten parallel als Nohup auf einem AIX-Server mit Oracle 10g Host ausgeführt. Diese Skripte werden von jemand anderem geschrieben und sollen gleichzeitig ausgeführt werden. Alle Skripts führen Aktualisierungen für eine Tabelle durch. Ich erhalte den Fehler,ORA-00060: Deadlock beim Warten auf Ressource

ORA-00060: Deadlock erkannt, während für Ressource wartet

Als ich für diese googeln, fand ich, http://www.dba-oracle.com/t_deadly_perpetual_embrace_locks.htm

Obwohl die Skripte ausführen Gleichzeitig führen sie Updates für verschiedene Datensätze der Tabelle durch, die durch die WHERE-Klausel ohne Überlappungen von Datensätzen zwischen ihnen bestimmt werden.

So hätte dies den Fehler verursacht ?.

Tritt dieser Fehler unabhängig davon auf, wo die Aktualisierungen für eine Tabelle ausgeführt werden ?.

Sollte ich gleichzeitige Aktualisierungen auf einer Tabelle jederzeit vermeiden ?.

Seltsamerweise fand ich auch auf dem nohup.out-Protokoll, PL/SQL successfully completed nach dem oben genannten Fehler.

Bedeutet dies, dass Orakel aus dem Deadlock wiederhergestellt und die Updates erfolgreich abgeschlossen hat oder sollte ich diese Skripts seriell wiederholen? Jede Hilfe wäre willkommen.

Vielen Dank im Voraus.

Antwort

8

Sie können Deadlocks für mehr als nur Zeilensperren, z. siehe this. Die Skripts konkurrieren möglicherweise um andere Ressourcen, z. B. Indexblöcke.

Ich habe das in der Vergangenheit durch Entwicklung der Parallelität in einer Weise, dass verschiedene Instanzen arbeiten an Teilen der Arbeitslast, die weniger wahrscheinlich beeinflussen, Blöcke, die nahe beieinander sind; Zum Beispiel würde ich für eine Aktualisierung einer großen Tabelle anstelle der parallelen Slaves, die etwas wie MOD(n,10) verwenden, TRUNC(n/10) verwenden, was bedeutet, dass jeder Slave an einem zusammenhängenden Datensatz arbeitete.

Es gibt natürlich viel bessere Möglichkeiten, einen Job für die Parallelität aufzutrennen, z.B. DBMS_PARALLEL_EXECUTE.

Nicht sicher, warum Sie "PL/SQL erfolgreich abgeschlossen" bekommen, vielleicht behandeln Ihre Skripte die Ausnahme?

+0

Vielen Dank für die Info. – wowrt

+0

Link ist sehr nützlich! Sehr einfache Erklärung. – CGK

23

Ich hatte vor kurzem mit einem ähnlichen Problem zu kämpfen. Es stellte sich heraus, dass der Datenbank Indizes für Fremdschlüssel fehlten. Dies führte dazu, dass Oracle viel mehr Datensätze blockierte als erforderlich, was schnell zu einem Deadlock bei hoher Parallelität führte. Hier

ist ein ausgezeichneter Artikel mit vielen guten Detail, Vorschläge und Informationen darüber, wie ein Deadlock zu beheben: http://www.oratechinfo.co.uk/deadlocks.html#unindex_fk

3

ich in diese Ausgabe lief auch. Ich kenne die technischen Details nicht, was tatsächlich geschah. Jedoch, in my situation, war die Ursache dafür, dass in der Oracle-Datenbank Kaskadierungslöschungen eingerichtet wurden und mein JPA/Hibernate-Code auch versuchte, die kaskadierenden Löschaufrufe durchzuführen.Mein Rat ist also, dass Sie genau wissen, was passiert.