Heim >Datenbank >Oracle >Was ist die Ursache für einen Oracle-Deadlock?

Was ist die Ursache für einen Oracle-Deadlock?

WBOY
WBOYOriginal
2022-03-03 16:41:428617Durchsuche

Gründe: 1. Die Reihenfolge des Ressourcenzugriffs zwischen Transaktionen wechselt und zwei Benutzer greifen auf die Tabellen des jeweils anderen zu, was zu einem Deadlock führt. 2. Zwei Benutzer ändern gleichzeitig denselben Datensatz, was zu einem Deadlock führt . Das Ausführen von Anweisungen, die die Bedingungen nicht erfüllen, und eine unsachgemäße Indizierung führen zu Deadlocks bei globalen Scans.

Was ist die Ursache für einen Oracle-Deadlock?

Die Betriebsumgebung dieses Tutorials: Windows 10-System, Oracle 11g-Version, Dell G3-Computer.

Was ist die Ursache für einen Oracle-Deadlock?

Die Datenbank ist eine von mehreren Benutzern gemeinsam genutzte Ressource. Wenn mehrere Benutzer gleichzeitig auf Daten zugreifen, greifen mehrere Transaktionen gleichzeitig auf dieselben Daten in der Datenbank zu. Wenn gleichzeitige Vorgänge nicht kontrolliert werden, können falsche Daten gelesen und gespeichert werden, wodurch die Konsistenz der Datenbank zerstört wird. Das Sperren ist eine sehr wichtige Technologie, um die Parallelitätskontrolle der Datenbank zu erreichen. In praktischen Anwendungen treten häufig Ausnahmen im Zusammenhang mit Sperren auf. Wenn zwei Transaktionen eine Reihe widersprüchlicher Sperren erfordern und die Transaktion nicht fortgesetzt werden kann, kommt es zu einem Deadlock, der die normale Ausführung der Anwendung erheblich beeinträchtigt.

Sperrtyp:

1. Gemeinsame Sperren (Share Locks, S-Sperre): Datenobjekte mit gemeinsamen Sperren können von anderen Transaktionen gelesen, aber nicht geändert werden. Die Datenbank verwendet diese beiden grundlegenden Sperrtypen, um die Parallelität von Datenbanktransaktionen zu steuern.

2. Exklusive Sperren (X-Sperre): Wenn ein Datenobjekt mit einer exklusiven Sperre gesperrt ist, können andere Transaktionen es nicht lesen oder ändern.

3. Exklusive Sperre: Basierend auf der gemeinsamen Sperre wird sie zu einer exklusiven Sperre aufgewertet.

4. Aktualisierungssperre: Alle Benutzer können lesen, aber ich kann in Zukunft Aktualisierungsvorgänge durchführen. Ich habe die Qualifikation von der gemeinsamen Sperre (zum Lesen) zur exklusiven Sperre (zum Aktualisieren) erhalten. Für diese Transaktion kann nur eine Update-Sperre berechtigt sein.

Ursachen:

1. Wechsel der Ressourcenzugriffssequenz zwischen Transaktionen: Ein Benutzer 1 greift auf Tabelle A (gesperrte Tabelle A) zu und ein anderer Benutzer 2 greift auf Tabelle B (gesperrte Tabelle B) zu ) und dann versucht, auf Tabelle A zuzugreifen; zu diesem Zeitpunkt muss Benutzer 1 warten, bis Benutzer 2 Tabelle B freigibt, bevor er fortfahren kann, da Benutzer 2 Tabelle B gesperrt hat. Ebenso muss Benutzer 2 warten, bis Benutzer 1 die Tabelle B freigibt Tabelle A, bevor es weitergehen kann. Es kommt zu einem Deadlock. Lösung: Programmlogikproblem, achten Sie auf die Aufrufreihenfolge der Tabelle

2 Ändern Sie gleichzeitig denselben Datensatz: Benutzer 1 fragt einen Datensatz ab und ändert dann den Datensatz. Die Transaktion von Benutzer 1 wird gesperrt Die Art der Abfrage besteht darin, dass die gemeinsame Sperre versucht, zu einer exklusiven Sperre zu werden, und die exklusive Sperre in Benutzer 2 warten muss, bis 1 die gemeinsame Sperre aufhebt, da 1 eine gemeinsame Sperre hat und die exklusive Sperre von 1 aufgrund dessen nicht erhöht werden kann Die exklusive Sperre von 2 kann nicht aufgehoben werden, daher kommt es zu einem Deadlock:

3. Eine unsachgemäße Indizierung führt zu einem vollständigen Tabellenscan: Die Transaktion führt eine Anweisung aus, die die Bedingungen nicht erfüllt. Es wird ein vollständiger Tabellenscan ausgeführt. oder die Menge der Tabellendaten ist sehr groß. Gegebenenfalls werden zu wenige oder keine Indizes erstellt. Lösung: Verwenden Sie keine zu komplexen Abfragen, die mehrere Tabellen in SQL-Anweisungen verknüpfen und Indizes zur Optimierung erstellen. Oracle Deadlocks anzeigen und Deadlocks freigeben

select sess.sid,     sess.serial#,     lo.oracle_username,     lo.os_user_name,     ao.object_name,     lo.locked_mode     from v$locked_object lo,     dba_objects ao,     v$session sess where ao.object_id = lo.object_id and lo.session_id = sess.sid; 
alter system kill session '738,1429';  --释放资源

2

Das obige ist der detaillierte Inhalt vonWas ist die Ursache für einen Oracle-Deadlock?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn