Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Ursache für Deadlock-Fehler aus Oracle-Trace-Datei finden

Zuerst select -Anweisung sperrt niemals irgendetwas in Oracle, sondern verwendet nur die letzte verfügbare konsistente Version der Daten. Es ist kein Fall für select ... for update die Daten wie update sperrt seit Oracle 9i, aber es gibt kein for update Klausel in der Abfrage von Frage.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       210      72    SX   SSX      208      24    SX   SSX

Sitzung Nr. 72 hält eine Sperre auf Tabellenebene (TM) mit dem Typ „Row Exclusive“ (SX) und möchte eine Sperre „Share Row Exclusive“ (SSX) für dieselbe Tabelle erwerben. Diese Sitzung wurde durch Sitzung Nr. 24 blockiert, die bereits eine Sperre auf Tabellenebene des gleichen Typs (SX) enthält und wartet, während die SSX-Sperre verfügbar wäre.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       208      24    SX   SSX      210      72    SX   SSX

Dies (zweite Reihe) zeigt genau dieselbe Situation, aber in entgegengesetzter Richtung:Sitzung Nr. 24 wartet darauf, dass die SSX-Sperre verfügbar wird, wird jedoch von Sitzung Nr. 72 blockiert, die bereits eine SX-Sperre auf derselben Tabelle hält.

Sitzung Nr. 24 und Sitzung Nr. 72 blockieren sich also gegenseitig:Deadlock tritt auf.

Beide Sperrtypen (SX und SSX) sind Sperren auf Tabellenebene.
Um die Situation zu verstehen, empfehle ich, diesen Artikel von Franck Pachot zu lesen.

Unten finden Sie Zitate aus diesem Artikel, die für Ihre Situation direkt relevant sind (beachten Sie, dass die Abkürzungen SSX und SRX gleichwertig sind):

Die referenzielle Integrität erwirbt auch TM-Sperren. Beispielsweise führt das häufige Problem mit nicht indizierten Fremdschlüsseln zu S-Sperren auf untergeordneten Tabellen, wenn Sie eine Löschung oder Aktualisierung des Schlüssels auf der übergeordneten Tabelle vornehmen. Dies liegt daran, dass Oracle ohne einen Index keine einzelne Ressource auf niedrigerer Ebene sperren muss, um eine gleichzeitige Einfügung zu verhindern, die die referenzielle Integrität verletzen kann.
Wenn die Fremdschlüsselspalten die führenden Spalten in einem regulären Index sind, dann der erste Indexeintrag mit Der Elternwert kann als einzelne Ressource verwendet und mit einem TXlock auf Zeilenebene gesperrt werden.
Und was ist, wenn die referenzielle Integrität eine Löschkaskade hat? Zusätzlich zum S-Modus besteht die Absicht, Zeilen in der untergeordneten Tabelle zu aktualisieren, wie beim Modus Zeile X (RX). Hier kommt die Share Rowexclusive (SRX) vor:S+RX=SRX.

Die wahrscheinlichste Variante ist also, dass Sitzung Nr. 72 und Sitzung Nr. 24 einige Zeilen in EMPLOYEE löschen Tabelle zur gleichen Zeit, und es gibt on delete cascade Einschränkung für EMPSAL_EMP_ID in Verbindung mit fehlendem Index zu EMPLOYEE_SALARY Tabelle, in der EMPSAL_EMP_ID Spalte zuerst aufgeführt.