Heim  >  Artikel  >  Datenbank  >  Detaillierte grafische und textliche Erläuterung der Oracle-Sperrtabellenlösungen

Detaillierte grafische und textliche Erläuterung der Oracle-Sperrtabellenlösungen

WBOY
WBOYnach vorne
2022-08-17 18:13:513186Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über Oracle Bei der Entwicklung von Oracle-Datenbanken stoßen wir häufig auf Oracle-Datentabellen, die häufig verwendet werden, und Oracle-Sperrtabellen werden hier angezeigt. Ich hoffe, diese Informationen über die Methode wird für jeden hilfreich sein.

Detaillierte grafische und textliche Erläuterung der Oracle-Sperrtabellenlösungen

Empfohlenes Tutorial: „Oracle-Video-Tutorial“

Ich glaube, jeder kennt das Sperren von Tabellen oder das Sperren von Zeitlimits. Der Grund dafür ist der exklusive Blockierungsmechanismus der Datenbank DML-Anweisung Die Tabellen- oder Zeilendaten werden gesperrt, bis die Transaktion festgeschrieben oder zurückgesetzt wird oder die aktuelle Sitzung zwangsweise beendet wird.

Für unser Anwendungssystem kommt es wahrscheinlich zu einer Tabellensperre, wenn die SQL-Ausführung langsam ist und es keine Zeitüberschreitung gibt (ein SQL wurde aus irgendeinem Grund erfolglos ausgeführt (das Spoon-Tool führt Datenextraktion und Push durch) und Ressourcen wurden nicht freigegeben) Daher ist es auch besonders wichtig, effizientes SQL zu schreiben! Es gibt andere Situationen, in denen eine Tabellensperre auftreten kann, bei der es sich um ein Szenario mit hoher Parallelität handelt. Das durch eine hohe Parallelität verursachte Problem besteht darin, dass Spring-Transaktionen dazu führen, dass Datenbanktransaktionen nicht festgeschrieben werden und einen Deadlock verursachen (die aktuelle Transaktion wartet darauf, dass andere Transaktionen Sperrressourcen freigeben). )! Dadurch wird die Ausnahme java.sql.SQLException: Sperrwartezeitüberschreitung überschritten; ausgelöst.

Wie kann man also die Sperrtabelle oder das Sperrzeitlimit lösen? Die vorübergehende Lösung besteht darin, die Tabelle oder Anweisung herauszufinden, die um die Sperrressource konkurriert, die aktuelle Sitzung oder Sitzung direkt zu beenden und die Freigabe der Sperrressource zu erzwingen. Zum Beispiel

Die Lösung lautet wie folgt:

1 ändert ein bestimmtes Datenelement, sendet jedoch nicht den Datensatz der nicht festgeschriebenen Transaktion

2. Sitzung2 versucht, es zu ändern

Wir können die Änderung sehen. Die Datensätze nicht festgeschriebener Transaktionen befinden sich in einem Wartezustand, bis die andere Partei die Sperrressource freigibt oder Sitzung1 zwangsweise schließt. Dies zeigt auch, dass Oracle Sperren auf Zeilenebene erreicht hat!

Dies ist nur eine einfache Simulation der Tabellensperrsituation. Sie können auf einen Blick erkennen, dass es sich um die durch Sitzung1 verursachte Tabellensperre handelt. Wenn diese Situation in der tatsächlichen Entwicklung auftritt, wird SQL im Allgemeinen verwendet, um direkt die Tabellen oder Anweisungen zu ermitteln, die um Sperrressourcen konkurrieren, und die Ressourcen dann zwangsweise freizugeben! !

3. Sitzung3 fragt die Tabellen oder Anweisungen konkurrierender Ressourcen ab und erzwingt die Freigabe von Ressourcen. Die Abfrageergebnisse lauten wie folgt: Nur die ersten beiden Felder sind für die erzwungene Freigabe von Ressourcen nützlich , nachdem

-- 查询未提交事务的session信息,注意执行以下SQL,用户需要有DBA权限才行
SELECT
    L.SESSION_ID,
    S.SERIAL#,
    L.LOCKED_MODE AS 锁模式,
    L.ORACLE_USERNAME AS 所有者,
    L.OS_USER_NAME AS 登录系统用户名,
    S.MACHINE AS 系统名,
    S.TERMINAL AS 终端用户名,
    O.OBJECT_NAME AS 被锁表对象名,
    S.LOGON_TIME AS 登录数据库时间
FROM V$LOCKED_OBJECT L
    INNER JOIN ALL_OBJECTS O ON O.OBJECT_ID = L.OBJECT_ID
    INNER JOIN V$SESSION S ON S.SID = L.SESSION_ID
WHERE 1 = 1

session1 gewaltsam beendet hat, achten Sie auf die Ausführung von session2! Wir werden feststellen, dass das Warten von Sitzung2 sofort beendet und ausgeführt wird! Ich glaube, jeder hat Zweifel, session_id ist 29 und 34, wie kann man feststellen, ob sie zu session1 oder session2 gehören, und sicherstellen, dass session1 beendet wird und session2 die DML-Anweisung erfolgreich ausführen kann?

Tatsächlich ist es sehr einfach Die Beurteilungsmethode ist hier die Ausführung von Sitzung1. Um die Transaktion zu aktualisieren, aber nicht festzuschreiben, können Sie zunächst die Sitzungsinformationen der nicht festgeschriebenen Transaktion abfragen.

Empfohlenes Tutorial: „

Oracle Video Tutorial

Das obige ist der detaillierte Inhalt vonDetaillierte grafische und textliche Erläuterung der Oracle-Sperrtabellenlösungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen