Gleichzeitiger Datenzugriff und Konsistenz
Der Skriptcontent auf dieser Seite ist ausschließlich für Navigationszwecke vorgesehen und bewirkt keinerlei Änderung des Contents.
In diesem Kapitel wird erläutert, wie Oracle AI Database konsistente Daten in einer Mehrbenutzer-Datenbankumgebung verwaltet.
-
Einführung in Gleichzeitigkeit und Konsistenz von Daten In einer Einzelbenutzerdatenbank kann ein Benutzer Daten ändern, ohne dass andere Benutzer dieselben Daten gleichzeitig ändern müssen. In einer Mehrbenutzerdatenbank können Anweisungen in mehreren gleichzeitigen Transaktionen jedoch dieselben Daten aktualisieren. Transaktionen, die gleichzeitig ausgeführt werden, müssen aussagekräftige und konsistente Ergebnisse liefern.
-
Überblick über Oracle AI Database Transaction Isolation Levels Der ANSI-Standard für Transaktionsisolationsebenen ist in Bezug auf die Phänomene definiert, die für jede Isolationsebene entweder zulässig oder verhindert werden.
-
Überblick über den Oracle AI Database-Sperrmechanismus Ein Sperre ist ein Mechanismus, der destruktive Interaktionen verhindert.
-
Überblick über automatische Sperren Oracle AI Database sperrt automatisch eine Ressource im Namen einer Transaktion, um zu verhindern, dass andere Transaktionen etwas tun, das exklusiven Zugriff auf dieselbe Ressource erfordert.
-
Überblick über manuelle Datensperren Sie können die standardmäßigen Sperrmechanismen von Oracle AI Database manuell außer Kraft setzen.
-
Überblick über benutzerdefinierte Sperren Mit Oracle AI Database Lock Management-Services können Sie eigene Sperren für eine bestimmte Anwendung definieren.
Gleichzeitigkeit und Konsistenz von Daten - Einführung
In einer Einzelbenutzerdatenbank kann ein Benutzer Daten ändern, ohne dass andere Benutzer dieselben Daten gleichzeitig ändern müssen. In einer Mehrbenutzerdatenbank können Anweisungen in mehreren gleichzeitigen Transaktionen jedoch dieselben Daten aktualisieren. Transaktionen, die gleichzeitig ausgeführt werden, müssen aussagekräftige und konsistente Ergebnisse liefern.
Eine Mehrbenutzerdatenbank muss Folgendes bereitstellen:
-
Die Sicherheit, dass Benutzer gleichzeitig auf Daten zugreifen können (Datennebenläufigkeit)
-
Die Sicherheit, dass jeder Benutzer eine konsistente Ansicht der Daten sieht (Datenkonsistenz), einschließlich sichtbarer Änderungen, die von den eigenen Transaktionen des Benutzers und festgeschriebenen Transaktionen anderer Benutzer vorgenommen wurden
Um ein konsistentes Transaktionsverhalten zu beschreiben, wenn Transaktionen gleichzeitig ausgeführt werden, haben Datenbankforscher ein Transaktionsisolationsmodell namens Serialisierbarkeit definiert. Eine serialisierbare Transaktion wird in einer Umgebung ausgeführt, in der es so aussieht, als würden keine anderen Benutzer Daten in der Datenbank ändern.
Während dieser Grad der Isolation zwischen Transaktionen im Allgemeinen wünschenswert ist, kann die Ausführung vieler Anwendungen im serialisierbaren Modus den Anwendungsdurchsatz erheblich beeinträchtigen. Eine vollständige Isolierung von Transaktionen, die gleichzeitig ausgeführt werden, könnte bedeuten, dass eine Transaktion keine Einfügung in eine Tabelle ausführen kann, die von einer anderen Transaktion abgefragt wird. Kurz gesagt, reale Überlegungen erfordern in der Regel einen Kompromiss zwischen perfekter Transaktionsisolation und Performance.
Oracle AI Database sorgt für Datenkonsistenz, indem ein Multiversionskonsistenzmodell und verschiedene Arten von Sperren und Transaktionen verwendet werden. Auf diese Weise kann die Datenbank mehreren gleichzeitigen Benutzern eine Datenansicht bereitstellen, wobei jede Ansicht zu einem bestimmten Zeitpunkt konsistent ist. Da verschiedene Versionen von Datenblöcken gleichzeitig vorhanden sein können, können Transaktionen die Version der Daten lesen, die zu dem Zeitpunkt festgeschrieben wurden, der für eine Abfrage erforderlich ist, und Ergebnisse zurückgeben, die zu einem einzelnen Zeitpunkt konsistent sind.
-
Multiversions-Lesekonsistenz In Oracle AI Database ist Multiversioning die Möglichkeit, mehrere Datenversionen gleichzeitig zu materialisieren. Oracle AI Database sorgt für mehrstufige Lesekonsistenz.
-
Sperrmechanismen Im Allgemeinen verwenden Mehrbenutzerdatenbanken eine Art Datensperre, um die Probleme im Zusammenhang mit gleichzeitigem Datenzugriff, Konsistenz und Integrität zu lösen.
-
ANSI/ISO Transaction Isolation Levels Der SQL-Standard, der sowohl von ANSI als auch von ISO/IEC übernommen wurde, definiert vier Ebenen der Transaktionsisolation. Diese Ebenen haben unterschiedliche Auswirkungen auf den Transaktionsverarbeitungsdurchsatz. Siehe auch: "Datenintegrität" und "Transaktionen"
Multiversions-Lesekonsistenz
In Oracle AI Database ist Multiversioning die Möglichkeit, mehrere Datenversionen gleichzeitig zu materialisieren. Oracle AI Database sorgt für mehrstufige Lesekonsistenz.
Abfragen einer Oracle-Datenbank weisen folgende Merkmale auf:
-
Lesekonsistente Abfragen
Die von einer Abfrage zurückgegebenen Daten werden für einen einzelnen Zeitpunkt festgeschrieben und konsistent.
Hinweis: Oracle AI Database lässt nie einen Dirty Read zu, der auftritt, wenn eine Transaktion nicht festgeschriebene Daten in einer anderen Transaktion liest.
Angenommen, eine Transaktion aktualisiert einen Spaltenwert, ohne festzuschreiben, um das Problem mit Dirty Read zu veranschaulichen. Eine zweite Transaktion liest den aktualisierten Wert und den Wert "dirty" (nicht festgeschrieben). Die erste Session rollt die Transaktion zurück, sodass die Spalte ihren alten Wert hat. Die zweite Transaktion verwendet jedoch den aktualisierten Wert, wodurch die Datenbank beschädigt wird. Dirty Read beeinträchtigen die Datenintegrität, verletzen Fremdschlüssel und ignorieren eindeutige Constraints.
-
Nicht blockierende Abfragen
Lese- und Schreibvorgänge von Daten blockieren einander nicht.
-
Lesekonsistenz auf Statement-Ebene Oracle AI Database setzt immer die Lesekonsistenz auf Statement-Ebene durch, die gewährleistet, dass die von einer einzelnen Abfrage zurückgegebenen Daten für einen einzelnen Zeitpunkt festgeschrieben und konsistent sind.
-
Lesekonsistenz auf Transaktionsebene Oracle AI Database kann auch Lesekonsistenz für alle Abfragen in einer Transaktion bereitstellen, die als Lesekonsistenz auf Transaktionsebene bezeichnet werden.
-
Konsistenz und Undo-Segmente lesen Um das Multiversions-Lesekonsistenzmodell zu verwalten, muss die Datenbank ein lesekonsistentes Datenset erstellen, wenn eine Tabelle gleichzeitig abgefragt und aktualisiert wird.
-
Lesekonsistenz und verzögerte Einfügungen Ein spezieller Einfügetyp, der als verzögerte Einfügung bezeichnet wird, verwendet nicht den Standard-Lesekonsistenzmechanismus. Siehe auch: "Sperrverhalten - Übersicht"
Lesekonsistenz auf Auszugsebene
Oracle AI Database setzt immer die Lesekonsistenz auf Anweisungsebene durch, die gewährleistet, dass die von einer einzelnen Abfrage zurückgegebenen Daten für einen einzigen Zeitpunkt festgeschrieben und konsistent sind.
Der Zeitpunkt, zu dem eine einzelne SQL-Anweisung konsistent ist, hängt von der Transaktionsisolationsebene und der Art der Abfrage ab:
-
In der festgeschriebenen Isolationsebene für Lesevorgänge ist dieser Zeitpunkt der Zeitpunkt, zu dem die Anweisung geöffnet wurde. Beispiel: Wenn eine
SELECT-Anweisung bei SCN 1000 geöffnet wird, ist diese Anweisung mit SCN 1000 konsistent. -
In einer serialisierbaren oder schreibgeschützten Transaktion ist dieser Zeitpunkt der Beginn der Transaktion. Beispiel: Wenn eine Transaktion bei SCN 1000 beginnt und mehrere
SELECT-Anweisungen in dieser Transaktion auftreten, ist jede Anweisung mit SCN 1000 konsistent. -
In einem Flashback Query-Vorgang (
SELECT ... AS OF) gibt dieSELECT-Anweisung explizit den Zeitpunkt an. Beispiel: Sie können eine Tabelle abfragen, wie sie am letzten Donnerstag um 2 Uhr morgens angezeigt wurde.
Siehe auch: Oracle AI Database Development Guide enthält Informationen zu Flashback Query
Lesekonsistenz auf Transaktionsebene
Oracle AI Database kann auch Lesekonsistenz für alle Abfragen in einer Transaktion bereitstellen, die als Lesekonsistenz auf Transaktionsebene bezeichnet wird.
In diesem Fall werden für jede Anweisung in einer Transaktion Daten vom gleichen Zeitpunkt angezeigt. Dies ist der Zeitpunkt, zu dem die Transaktion begann.
Bei Abfragen, die von einer serialisierbaren Transaktion durchgeführt werden, werden Änderungen angezeigt, die von der Transaktion selbst vorgenommen wurden. Beispiel: Bei einer Transaktion, die employees aktualisiert und dann employees abfragt, werden die Aktualisierungen angezeigt. Die Lesekonsistenz auf Transaktionsebene erzeugt wiederholbare Lesevorgänge und stellt eine Abfrage keinen Phantom-Lesevorgängen zur Verfügung.
Lesekonsistenz und Undo-Segmente
Um das Konsistenzmodell für mehrere Versionen zu verwalten, muss die Datenbank ein lesekonsistentes Datenset erstellen, wenn eine Tabelle gleichzeitig abgefragt und aktualisiert wird.
Oracle AI Database erreicht Lesekonsistenz durch Undo-Daten.
Wenn ein Benutzer Daten ändert, erstellt Oracle AI Database Undo-Einträge, die in Undo-Segmente geschrieben werden. Die Undo-Segmente enthalten die alten Datenwerte, die durch nicht festgeschriebene oder kürzlich festgeschriebene Transaktionen geändert wurden. Somit können mehrere Versionen derselben Daten zu verschiedenen Zeitpunkten in der Datenbank vorhanden sein. Die Datenbank kann Snapshots von Daten zu verschiedenen Zeitpunkten verwenden, um lesekonsistente Ansichten der Daten bereitzustellen und nicht blockierende Abfragen zu ermöglichen.
Die Lesekonsistenz wird in Einzelinstanz- und Oracle Real Application Clusters-(Oracle RAC-)Umgebungen gewährleistet. Oracle RAC verwendet einen Cache-zu-Cache-Blockübertragungsmechanismus, der als Cache Fusion bezeichnet wird, um lesekonsistente Images von Datenblöcken von einer Datenbankinstanz zu einer anderen zu übertragen.
-
Lesekonsistenz: Beispiel Dieses Beispiel zeigt eine Abfrage, die Undo-Daten verwendet, um Lesekonsistenz auf Anweisungsebene in der festgeschriebenen Leseisolationsebene bereitzustellen.
-
Konsistenz- und Interested Transaction-Listen lesen Der Blockheader jedes Segmentblocks enthält eine Interested Transaction List (ITL).
Siehe:
-
"Undo-Segmente", um mehr über Undo-Speicher zu erfahren
-
Oracle AI Database SecureFiles and Large Objects Developer's Guide, um mehr über Lesekonsistenzmechanismen für LOBs zu erfahren
Lesekonsistenz – Beispiel
Dieses Beispiel zeigt eine Abfrage, die Undo-Daten verwendet, um Lesekonsistenz auf Anweisungsebene in der festgeschriebenen Isolationsebene bereitzustellen.
Abbildung 1: Lesekonsistenz in der Read Committed Isolation Level

Beschreibung der Abbildung cncpt069.gif
Während die Datenbank Datenblöcke im Namen einer Abfrage abruft, stellt die Datenbank sicher, dass die Daten in jedem Block den Inhalt des Blocks widerspiegeln, als die Abfrage begann. Die Datenbank setzt Änderungen an dem Block nach Bedarf zurück, um den Block bis zu dem Zeitpunkt zu rekonstruieren, zu dem die Verarbeitung der Abfrage gestartet wurde.
Die Datenbank verwendet einen internen Bestellmechanismus, der als SCN bezeichnet wird, um die Reihenfolge der Transaktionen zu gewährleisten. Wenn die SELECT-Anweisung in die Ausführungsphase eintritt, bestimmt die Datenbank die SCN, die zum Zeitpunkt der Ausführung der Abfrage aufgezeichnet wurde. In Abbildung 12-1 lautet diese SCN 10023. Die Abfrage sieht nur festgeschriebene Daten in Bezug auf die SCN 10023.
In Abbildung 12-1 geben Blöcke mit SCNs nach 10023 geänderte Daten an, wie die beiden Blöcke mit SCN 10024 zeigen. Die SELECT-Anweisung erfordert eine Version des Blocks, die mit festgeschriebenen Änderungen konsistent ist. Die Datenbank kopiert aktuelle Datenblöcke in einen neuen Puffer und wendet Undo-Daten an, um frühere Versionen der Blöcke zu rekonstruieren. Diese rekonstruierten Datenblöcke werden als konsistente Lese-(CR-)Klone bezeichnet.
In Abbildung 12-1 erstellt die Datenbank zwei CR-Klone: einen konsistenten Block für SCN 10006 und den anderen konsistenten Block für SCN 10021. Die Datenbank gibt die rekonstruierten Daten für die Abfrage zurück. Auf diese Weise verhindert Oracle AI Database schmutzige Lesevorgänge.
Siehe auch: "Datenbankpuffercache" und "Systemänderungsnummern (SCNs)"
Lesekonsistenz und Listen interessierter Transaktionen
Der Blockheader jedes Segmentblocks enthält eine Interested Transaction List (ITL).
Die Datenbank bestimmt anhand der ITL, ob eine Transaktion nicht festgeschrieben wurde, als die Datenbank mit der Änderung des Blocks begann.
Die Einträge in der ITL beschreiben, welche Transaktionen Zeilen gesperrt haben und welche Zeilen im Block festgeschriebene und nicht festgeschriebene Änderungen enthalten. Die ITL verweist auf die Transaktionstabelle im Undo-Segment, die Informationen zum Zeitpunkt der Änderungen an der Datenbank liefert.
In gewisser Weise enthält der Block-Header eine aktuelle Transaktionshistorie, die sich auf jede Zeile im Block ausgewirkt hat. Der Parameter INITRANS der Anweisungen CREATE TABLE und ALTER TABLE steuert die Menge der Transaktionshistorie, die beibehalten wird.
Siehe auch: Oracle AI Database SQL Language Reference, um mehr über den Parameter INITRANS zu erfahren
Lesekonsistenz und verzögerte Einfügungen
Ein spezieller Einfügetyp, der als verzögertes Einfügen bezeichnet wird, verwendet nicht das Standardverfahren für die Lesekonsistenz.
Bei einer verzögerten Einfügung wird der Hint MEMOPTIMIZE_WRITE verwendet, um ihn in eine Tabelle einzufügen, die als MEMOPTIMIZE FOR WRITE angegeben ist. Die Datenbank puffert diese Einfügungen im Large Pool und nicht im Puffercache. Die Datenbank verfolgt die Änderungen nicht mit Redo und Undo. Stattdessen schreibt die Datenbank die Änderungen automatisch fest, wenn der Space Management Coordinator (SMCO) den Puffer auf den Datenträger schreibt. Die Änderungen können nicht zurückgesetzt werden.
Verzögerte Einsätze unterscheiden sich von herkömmlichen Einsätzen auf wichtige Weise:
-
Daten im Large Pool, von denen die Anwendung annimmt, dass sie festgeschrieben werden, können verloren gehen. Beispiel: Die Datenbankinstanz kann fehlschlagen, bevor die Änderungen auf dem Datenträger gespeichert werden, obwohl die Anwendung meldet, dass die Änderungen gespeichert wurden.
-
Das direkte Lesen von Daten aus dem Speicher ist nicht zulässig. Ein Writer kann seine eigenen Änderungen erst lesen, wenn sie vom Hintergrundprozess auf den Datenträger geschrieben werden. Festgeschriebene Änderungen werden erst angezeigt, wenn sie auf den Datenträger geschrieben wurden.
Clientanwendungen, die einen Datenverlust vermeiden müssen, sollten eine lokale Kopie der Daten behalten, nachdem sie in den Large Pool geschrieben wurden. Der Client kann das DBMS_MEMOPTIMIZE-Package verwenden, um die Dauerhaftigkeit der Schreibvorgänge im Speicher zu verfolgen, und das DBMS_MEMOPTIMIZE_ADMIN-Package, um das Schreiben der Datenbank auf den Datenträger zu erzwingen.
Siehe:
-
Oracle AI Database SQL Language Reference, um mehr über den
MEMOPTIMIZE FOR WRITE-Hint zu erfahren
Sperrmechanismen
Im Allgemeinen verwenden Mehrbenutzerdatenbanken eine Art Datensperre, um die Probleme im Zusammenhang mit gleichzeitigem Datenzugriff, Konsistenz und Integrität zu lösen.
Ein Sperre ist ein Mechanismus, der destruktive Interaktionen zwischen Transaktionen verhindert, die auf dieselbe Ressource zugreifen.
Siehe auch: "Überblick über den Sperrmechanismus von Oracle AI Database"
ANSI-/ISO-Transaktionsisolationsebenen
Der SQL-Standard, der sowohl von ANSI als auch von ISO/IEC übernommen wurde, definiert vier Ebenen der Transaktionsisolation. Diese Ebenen haben unterschiedliche Auswirkungen auf den Transaktionsverarbeitungsdurchsatz.
Diese Isolationsebenen werden in Bezug auf Phänomene definiert, die zwischen gleichzeitiger Ausführung von Transaktionen verhindert werden müssen. Die vermeidbaren Phänomene sind:
-
Dirty-Lesevorgänge
Eine Transaktion liest Daten, die von einer anderen Transaktion geschrieben wurden, die noch nicht festgeschrieben wurde.
-
Nicht wiederholbare (Fuzzy-)Lesevorgänge
Eine Transaktion liest Daten, die sie zuvor gelesen hat, erneut und stellt fest, dass eine andere festgeschriebene Transaktion die Daten geändert oder gelöscht hat. Beispiel: Ein Benutzer fragt eine Zeile ab und fragt später dieselbe Zeile ab, nur um festzustellen, dass sich die Daten geändert haben.
-
Phantom liest
Eine Transaktion führt eine Abfrage erneut aus, die eine Zeilengruppe zurückgibt, die eine Suchbedingung erfüllt, und stellt fest, dass eine andere festgeschriebene Transaktion zusätzliche Zeilen eingefügt hat, die diese Bedingung erfüllen.
Beispiel: Eine Transaktion fragt die Anzahl der Mitarbeiter ab. Fünf Minuten später führt es die gleiche Abfrage aus, aber jetzt hat sich die Anzahl um eins erhöht, weil ein anderer Benutzer einen Datensatz für eine Neueinstellung eingefügt hat. Mehr Daten erfüllen die Abfragekriterien als zuvor, aber im Gegensatz zu einem Fuzzy-Lesevorgang bleiben die zuvor gelesenen Daten unverändert.
Der SQL-Standard definiert vier Isolationsebenen in Bezug auf die Phänomene, die eine Transaktion auf einer bestimmten Isolationsebene erleben darf. In Tabelle 12-1 sind die Ebenen dargestellt.
Tabelle 1: Vorbeugende Lesephänomene nach Isolationsebene
| Isolationsebene | Dirty-Read | Nicht wiederholbarer Lesevorgang | Phantomablesung |
|---|---|---|---|
| Lesen nicht festgeschrieben | Möglich | Möglich | Möglich |
| Gelesen festgeschrieben | Nicht zulässig | Möglich | Möglich |
| Wiederholbarer Lesevorgang | Nicht zulässig | Nicht zulässig | Möglich |
| Serialisierbar | Nicht zulässig | Nicht zulässig | Nicht zulässig |
Oracle AI Database bietet die Isolationsebenen "Read committed" (Standard) und "Serializable". Außerdem bietet die Datenbank einen schreibgeschützten Modus.
Siehe:
-
"Überblick über Oracle AI Database Transaction Isolation Levels", um mehr über festgeschriebene, serialisierbare und schreibgeschützte Isolationsebenen zu erfahren
-
Oracle AI Database SQL Language Reference für eine Diskussion über die Oracle AI Database-Konformität mit SQL-Standards
Transaktionsisolationsebenen in Oracle AI Database - Überblick
Der ANSI-Standard für Transaktionsisolationsebenen wird in Bezug auf die Phänomene definiert, die für jede Isolationsebene entweder zulässig oder verhindert werden.
Oracle AI Database bietet die Transaktionsisolationsebenen:
-
Festgeschriebene Isolationsebene lesen In der gelesenen festgeschriebenen Isolationsebene werden bei jeder von einer Transaktion ausgeführten Abfrage nur Daten angezeigt, die vor dem Start der Abfrage festgeschrieben wurden, nicht die Transaktion.
-
Serialisierbare Isolationsebene In der Serialisierbaren Isolationsebene werden bei einer Transaktion nur Änderungen angezeigt, die zum Zeitpunkt der Transaktion festgeschrieben wurden, nicht die Abfrage, und Änderungen, die von der Transaktion selbst vorgenommen wurden.
-
Schreibgeschützte Isolationsebene Die schreibgeschützte Isolationsebene ähnelt der serialisierbaren Isolationsebene. Bei schreibgeschützten Transaktionen können Daten jedoch nur in der Transaktion geändert werden, wenn der Benutzer
SYSist.
Siehe:
-
Oracle AI Database Development Guide, um mehr über Transaktionsisolationsebenen zu erfahren
-
Oracle AI Database SQL Language Reference und Oracle AI Database PL/SQL Language Reference, um mehr über
SET TRANSACTION ISOLATION LEVELzu erfahren
Festgeschriebene Isolationsebene lesen
In der gelesenen festgeschriebenen Isolationsebene werden bei jeder von einer Transaktion ausgeführten Abfrage nur Daten angezeigt, die vor der Abfrage festgeschrieben wurden, nicht die Transaktion.
Diese Isolationsebene ist der Standardwert. Sie eignet sich für Datenbankumgebungen, in denen wahrscheinlich nur wenige Transaktionen in Konflikt stehen.
Eine Abfrage in einer ausgelesenen festgeschriebenen Transaktion verhindert das Lesen von Daten, die festgeschrieben werden, während die Abfrage ausgeführt wird. Beispiel: Wenn eine Abfrage einen Scan einer Tabelle mit einer Million Zeilen durchläuft und eine andere Transaktion eine Aktualisierung in Zeile 950.000 festschreibt, sieht die Abfrage diese Änderung nicht, wenn sie Zeile 950.000 liest. Da die Datenbank jedoch nicht verhindert, dass andere Transaktionen Daten ändern, die von einer Abfrage gelesen werden, können andere Transaktionen Daten zwischen Abfrageausführungen ändern. Daher können bei einer Transaktion, bei der dieselbe Abfrage zweimal ausgeführt wird, Fuzzy-Lesevorgänge und Phantome auftreten.
-
Konsistenz beim Lesen der festgeschriebenen Isolationsebene Die Datenbank bietet eine konsistente Ergebnismenge für jede Abfrage, die Datenkonsistenz garantiert, ohne dass der Benutzer etwas unternehmen muss.
-
Konflikthafte Schreibvorgänge in gelesenen festgeschriebenen Transaktionen In einer gelesenen festgeschriebenen Transaktion tritt ein konflikthafter Schreibvorgang auf, wenn die Transaktion versucht, eine Zeile zu ändern, die von einer nicht festgeschriebenen nebenläufigen Transaktion aktualisiert wurde.
Lesekonsistenz auf der Isolationsebene mit Lesezugriff
Die Datenbank stellt für jede Abfrage eine konsistente Ergebnismenge bereit, die Datenkonsistenz garantiert, ohne dass der Benutzer eine Aktion ausführt.
Eine implizite Abfrage, z.B. eine Abfrage, die von einer WHERE-Klausel in einer UPDATE-Anweisung impliziert wird, wird als konsistentes Ergebnisset garantiert. Jede Anweisung in einer impliziten Abfrage sieht jedoch nicht die Änderungen, die von der DML-Anweisung selbst vorgenommen wurden, sondern sieht die Daten so, wie sie vor den Änderungen vorhanden waren.
Wenn eine SELECT-Liste eine PL/SQL-Funktion enthält, wendet die Datenbank die Lesekonsistenz auf Anweisungsebene für SQL an, die im PL/SQL-Funktionscode ausgeführt wird, und nicht auf der übergeordneten SQL-Ebene. Beispiel: Eine Funktion kann auf eine Tabelle zugreifen, deren Daten von einem anderen Benutzer geändert und festgeschrieben werden. Für jede Ausführung von SELECT in der Funktion wird ein neuer lesekonsistenter Snapshot erstellt.
Siehe auch: "Unterabfragen"
Schreibvorgänge in gelesenen festgeschriebenen Transaktionen in Konflikt
In einer ausgelesenen festgeschriebenen Transaktion tritt ein widersprüchlicher Schreibvorgang auf, wenn die Transaktion versucht, eine Zeile zu ändern, die von einer nicht festgeschriebenen nebenläufigen Transaktion aktualisiert wurde.
Die Transaktion, die eine Zeilenänderung verhindert, wird manchmal als blockierende Transaktion bezeichnet. Die ausgelesene festgeschriebene Transaktion wartet, bis die blockierende Transaktion beendet und ihre Zeilensperre freigegeben wird.
Folgende Optionen stehen zur Auswahl:
-
Wenn die blockierende Transaktion zurückgesetzt wird, ändert die wartende Transaktion die zuvor gesperrte Zeile so, als ob die andere Transaktion nie vorhanden wäre.
-
Wenn die blockierende Transaktion ihre Sperren festschreibt und freigibt, wird die wartende Transaktion mit der beabsichtigten Aktualisierung der neu geänderten Zeile fortgesetzt.
Die folgende Tabelle zeigt, wie Transaktion 1, die serialisierbar oder gelesen festgeschrieben sein kann, mit der festgeschriebenen gelesenen Transaktion 2 interagiert. Es zeigt eine klassische Situation, die als verlorenes Update bezeichnet wird. Die von Transaktion 1 vorgenommene Aktualisierung ist nicht in der Tabelle enthalten, auch wenn Transaktion 1 sie festgeschrieben hat. Die Entwicklung einer Strategie zur Bewältigung verlorener Updates ist ein wichtiger Bestandteil der Anwendungsentwicklung.
Tabelle 2: Widersprüchliche Schreibvorgänge und verlorene Aktualisierungen in einer READ COMMITTED-Transaktion
| Session 1 | Session 2 | Erläuterung |
|---|---|---|
SQL> SELECT last_name,
salary FROM employees
WHERE last_name IN
('Banda', 'Greene',
'Hintz');
LAST_NAME SALARY
------------- ----------
Banda 6200
Greene 9500 |
Keine Aktion. | Sitzung 1 fragt die Gehälter für Banda, Greene und Hintz ab. Kein Mitarbeiter mit dem Namen Hintz gefunden. |
SQL> UPDATE employees SET salary = 7000 WHERE last_name = 'Banda'; |
Keine Aktion. | Sitzung 1 beginnt eine Transaktion, indem das Banda-Gehalt aktualisiert wird. Die Standardisolationsebene für Transaktion 1 ist READ COMMITTED. |
| Keine Aktion. | SQL> SET TRANSACTION ISOLATION LEVEL READ COMMITTED; |
Session 2 beginnt Transaktion 2 und setzt die Isolationsebene explizit auf READ COMMITTED. |
| Keine Aktion. | SQL> SELECT last_name,
salary FROM employees
WHERE last_name IN
('Banda', 'Greene',
'Hintz');
LAST_NAME SALARY
------------- ----------
Banda 6200
Greene 9500 |
Transaktion 2 fragt die Gehälter für Banda, Greene und Hintz ab. Oracle AI Database verwendet Lesekonsistenz, um das Gehalt für Banda vor der nicht festgeschriebenen Aktualisierung anzuzeigen, die von Transaktion 1 vorgenommen wurde. |
| Keine Aktion. | SQL> UPDATE employees SET salary = 9900 WHERE last_name='Greene'; |
Transaktion 2 aktualisiert das Gehalt für Greene erfolgreich, weil Transaktion 1 nur die Banda-Zeile gesperrt hat. |
SQL> INSERT INTO employees (employee_id, last_name, email, hire_date, job_id) VALUES (210, 'Hintz', 'JHINTZ', SYSDATE, 'SH_CLERK'); |
Keine Aktion. | Transaktion 1 fügt eine Zeile für den Mitarbeiter Hintz ein, schreibt aber nicht fest. |
| Keine Aktion. | SQL> SELECT last_name,
salary FROM employees
WHERE last_name IN
('Banda', 'Greene',
'Hintz');
LAST_NAME SALARY
------------- ----------
Banda 6200
Greene 9900 |
Transaktion 2 fragt die Gehälter der Angestellten Banda, Greene und Hintz ab. Transaktion 2 sieht eine eigene Gehaltsaktualisierung für Greene. In Transaktion 2 wird die nicht festgeschriebene Gehaltsaktualisierung für Banda oder die Hintz-Einfügung für Transaktion 1 nicht angezeigt. |
| Keine Aktion. | SQL> UPDATE employees SET salary = 6300 WHERE last_name = 'Banda'; -- prompt does not return |
Transaktion 2 versucht, die Zeile für Banda zu aktualisieren, die derzeit von Transaktion 1 gesperrt ist. Dadurch wird ein unvereinbarer Schreibvorgang erstellt. Transaktion 2 wartet, bis Transaktion 1 endet. |
SQL> COMMIT; |
Keine Aktion. | Transaktion 1 schreibt seine Arbeit fest und beendet die Transaktion. |
| Keine Aktion. | 1 row updated. SQL> |
Die Sperre für die Banda-Zeile ist jetzt freigegeben, sodass Transaktion 2 mit der Aktualisierung des Gehalts für Banda fortfährt. |
| Keine Aktion. | SQL> SELECT last_name,
salary FROM employees
WHERE last_name IN
('Banda', 'Greene',
'Hintz');
LAST_NAME SALARY
------------- ----------
Banda 6300
Greene 9900
Hintz |
Transaktion 2 fragt die Gehälter der Angestellten Banda, Greene und Hintz ab. Die Hintz-Einfügung, die von Transaktion 1 festgeschrieben wurde, ist jetzt für Transaktion 2 sichtbar. Transaktion 2 sieht eine eigene Aktualisierung des Banda-Gehalts. |
| Keine Aktion. | COMMIT; |
Transaktion 2 schreibt seine Arbeit fest und beendet die Transaktion. |
SQL> SELECT last_name,
salary FROM employees
WHERE last_name IN
('Banda', 'Greene',
'Hintz');
LAST_NAME SALARY
------------- ----------
Banda 6300
Greene 9900
Hintz |
Keine Aktion. | Session 1 fragt die Zeilen für Banda, Greene und Hintz ab. Das Gehalt für Banda ist 6300, das ist die Aktualisierung von Transaktion 2. Die Aktualisierung von Bandas Gehalt auf 7000, die durch Transaktion 1 vorgenommen wurde, ist jetzt "verloren". |
Siehe:
-
"Verwendung von Sperren", um mehr über verlorene Updates zu erfahren
-
"Zeilensperren (TX)", um zu erfahren, wann und warum die Datenbank Zeilensperren erhält
Serialisierbare Isolationsebene
In der serialisierbaren Isolationsebene werden für eine Transaktion nur Änderungen angezeigt, die zum Zeitpunkt der Transaktion festgeschrieben wurden, nicht die Abfrage und Änderungen, die von der Transaktion selbst vorgenommen wurden.
Eine serialisierbare Transaktion wird in einer Umgebung ausgeführt, in der es so aussieht, als würden keine anderen Benutzer Daten in der Datenbank ändern. Serialisierbare Isolierung eignet sich für Umgebungen:
-
Mit großen Datenbanken und kurzen Transaktionen, die nur wenige Zeilen aktualisieren
-
Die Wahrscheinlichkeit, dass zwei gleichzeitige Transaktionen dieselben Zeilen ändern, ist relativ gering.
-
Wenn Transaktionen mit relativ langer Ausführungszeit hauptsächlich schreibgeschützt sind
Bei serialisierbarer Isolation erstreckt sich die Lesekonsistenz, die normalerweise auf Anweisungsebene erhalten wird, auf die gesamte Transaktion. Jede Zeile, die von der Transaktion gelesen wird, wird beim erneuten Lesen sicher gleich sein. Jede Abfrage gibt garantiert dieselben Ergebnisse für die Dauer der Transaktion zurück, sodass Änderungen, die von anderen Transaktionen vorgenommen wurden, für die Abfrage nicht sichtbar sind, unabhängig davon, wie lange sie ausgeführt wurde. Bei serialisierbaren Transaktionen werden keine Dirty-Lesevorgänge, Fuzzy-Lesevorgänge oder Phantom-Lesevorgänge ausgeführt.
Mit Oracle AI Database kann eine serialisierbare Transaktion eine Zeile nur ändern, wenn Änderungen an der Zeile, die von anderen Transaktionen vorgenommen wurden, bereits festgeschrieben wurden, als die serialisierbare Transaktion begann. Die Datenbank generiert einen Fehler, wenn eine serialisierbare Transaktion versucht, Daten zu aktualisieren oder zu löschen, die von einer anderen Transaktion geändert wurden, die nach dem Beginn der serialisierbaren Transaktion festgeschrieben wurde:
ORA-08177: Cannot serialize access for this transaction
Wenn eine serialisierbare Transaktion mit dem Fehler ORA-08177 nicht erfolgreich verläuft, kann eine Anwendung mehrere Aktionen ausführen, darunter:
-
Schreiben Sie die ausgeführte Arbeit bis zu diesem Punkt fest
-
Führen Sie zusätzliche (aber unterschiedliche) Anweisungen aus, möglicherweise nachdem Sie ein Rollback zu einem zuvor in der Transaktion festgelegten Savepoint durchgeführt haben
-
Rollback der gesamten Transaktion ausführen
Die folgende Tabelle zeigt, wie eine serialisierbare Transaktion mit anderen Transaktionen interagiert. Wenn die serialisierbare Transaktion nicht versucht, eine Zeile zu ändern, die von einer anderen Transaktion festgeschrieben wurde, nachdem die serialisierbare Transaktion begonnen hat, wird ein serialisiertes Zugriffsproblem vermieden.
Tabelle 3: Serialisierbare Transaktion
| Session 1 | Session 2 | Erläuterung |
|---|---|---|
|
Keine Aktion. | Sitzung 1 fragt die Gehälter für Banda, Greene und Hintz ab. Kein Mitarbeiter mit dem Namen Hintz gefunden. |
|
Keine Aktion. | Sitzung 1 beginnt Transaktion 1, indem das Banda-Gehalt aktualisiert wird. Die Standardisolationsebene ist READ COMMITTED. |
| Keine Aktion. | |
Session 2 startet Transaktion 2 und setzt sie auf die Isolationsebene SERIALIZABLE. |
| Keine Aktion. | |
Transaktion 2 fragt die Gehälter für Banda, Greene und Hintz ab. Oracle AI Database verwendet Lesekonsistenz, um das Gehalt für Banda vor der nicht festgeschriebenen Aktualisierung anzuzeigen, die von Transaktion 1 vorgenommen wurde. |
| Keine Aktion. | |
Transaktion 2 aktualisiert das Greene-Gehalt erfolgreich, weil nur die Banda-Zeile gesperrt ist. |
|
Keine Aktion. | Transaktion 1 fügt eine Zeile für den Mitarbeiter Hintz ein. |
|
Keine Aktion. | Transaktion 1 schreibt seine Arbeit fest und beendet die Transaktion. |
|
|
Sitzung 1 fragt die Gehälter der Angestellten Banda, Greene und Hintz ab und sieht Änderungen, die durch Transaktion 1 festgeschrieben wurden. In Sitzung 1 wird das nicht festgeschriebene Greene-Update von Transaktion 2 nicht angezeigt. Transaktion 2 fragt die Gehälter der Angestellten Banda, Greene und Hintz ab. Durch die Lesekonsistenz von Oracle AI Database wird sichergestellt, dass das von Transaktion 1 festgeschriebene Hintz Insert- und Banda-Update nicht für Transaktion 2 sichtbar ist. Transaktion 2 sieht eine eigene Aktualisierung des Greene-Gehalts. |
| Keine Aktion. | |
Transaktion 2 schreibt seine Arbeit fest und beendet die Transaktion. |
|
|
In beiden Sitzungen werden die Gehälter für Banda, Greene und Hintz abgefragt. In jeder Session werden alle festgeschriebenen Änderungen angezeigt, die von Transaktion 1 und Transaktion 2 vorgenommen wurden. |
|
Keine Aktion. | Sitzung 1 beginnt Transaktion 3 durch Aktualisierung des Hintz-Gehalts. Die Standardisolationsebene für Transaktion 3 ist READ COMMITTED. |
| Keine Aktion. | |
Session 2 startet Transaktion 4 und setzt sie auf die Isolationsebene SERIALIZABLE. |
| Keine Aktion. | |
Transaktion 4 versucht, das Gehalt für Hintz zu aktualisieren, ist jedoch blockiert, da Transaktion 3 die Hintz-Zeile gesperrt hat. Transaktions-4-Queues hinter Transaktion 3. |
|
Keine Aktion. | Transaktion 3 schreibt die Aktualisierung des Hintz-Gehalts fest und beendet die Transaktion. |
| Keine Aktion. | |
Der Commit, der Transaktion 3 beendet, führt dazu, dass die Hintz-Aktualisierung in Transaktion 4 mit dem Fehler ORA-08177 nicht erfolgreich verläuft. Der Problemfehler tritt auf, weil Transaktion 3 das Hintz-Update nach Transaktion 4 festgeschrieben hat. |
| Keine Aktion. | |
Session 2 setzt Transaktion 4 zurück, wodurch die Transaktion beendet wird. |
| Keine Aktion. | |
Session 2 startet Transaktion 5 und setzt sie auf die Isolationsebene SERIALIZABLE. |
| Keine Aktion. | |
Transaktion 5 fragt die Gehälter für Banda, Greene und Hintz ab. Die von Transaktion 3 festgeschriebene Hintz-Gehaltsaktualisierung ist sichtbar. |
| Keine Aktion. | |
Transaktion 5 aktualisiert das Hintz-Gehalt auf einen anderen Wert. Da die von Transaktion 3 vorgenommene Hintz-Aktualisierung vor dem Start von Transaktion 5 festgeschrieben wurde, wird das Problem des serialisierten Zugriffs vermieden. Hinweis: Wenn eine andere Transaktion die Hintz-Zeile aktualisiert und festgeschrieben hat, nachdem Transaktion 5 gestartet wurde, tritt das Problem des serialisierten Zugriffs erneut auf. |
| Keine Aktion. | |
Session 2 schreibt das Update ohne Probleme fest und beendet die Transaktion. |
Schreibgeschützte Isolationsebene
Die schreibgeschützte Isolationsebene ähnelt der serialisierbaren Isolationsebene. Bei schreibgeschützten Transaktionen können Daten jedoch nur in der Transaktion geändert werden, wenn der Benutzer SYS ist.
Schreibgeschützte Transaktionen sind nicht anfällig für den Fehler ORA-08177. Schreibgeschützte Transaktionen sind nützlich, um Berichte zu generieren, in denen der Inhalt im Hinblick auf den Zeitpunkt des Transaktionsbeginns konsistent sein muss.
Oracle AI Database erreicht Lesekonsistenz, indem Daten nach Bedarf aus den Undo-Segmenten rekonstruiert werden. Da Undo-Segmente zirkulär verwendet werden, kann die Datenbank Undo-Daten überschreiben. Bei Berichten mit langer Ausführungszeit besteht das Risiko, dass Undo-Daten, die für die Lesekonsistenz erforderlich sind, von einer anderen Transaktion wiederverwendet wurden. Dadurch wird ein snapshot too old-Fehler ausgelöst. Wenn Sie einen Undo-Aufbewahrungszeitraum festlegen, der die Mindestdauer ist, während der die Datenbank versucht, alte Undo-Daten vor dem Überschreiben beizubehalten, wird dieses Problem angemessen vermieden.
Siehe:
-
Oracle AI Database - Administratordokumentation zum Festlegen des Undo-Aufbewahrungszeitraums
Oracle AI Database-Sperrmechanismus - Überblick
Ein Sperre ist ein Mechanismus, der destruktive Interaktionen verhindert.
Interaktionen sind destruktiv, wenn sie Daten fälschlicherweise aktualisieren oder zugrunde liegende Datenstrukturen falsch ändern, zwischen Transaktionen, die auf gemeinsame Daten zugreifen. Sperren spielen eine entscheidende Rolle bei der Aufrechterhaltung des gleichzeitigen Datenbankzugriffs und der Konsistenz.
-
Zusammenfassung des Sperrverhaltens Die Datenbank verwaltet verschiedene Arten von Sperren, je nachdem, welcher Vorgang die Sperre erhalten hat.
-
Sperren verwenden In einer Einzelbenutzerdatenbank sind keine Sperren erforderlich, da nur ein Benutzer Informationen ändert. Wenn jedoch mehrere Benutzer auf Daten zugreifen und diese ändern, muss die Datenbank eine Möglichkeit bieten, eine gleichzeitige Änderung derselben Daten zu verhindern.
-
Sperrmodi Oracle AI Database verwendet automatisch die niedrigste anwendbare Einschränkungsebene, um den höchsten Grad an gleichzeitigem Datenzugriff bei gesicherter Datenintegration zu gewährleisten und gleichzeitig eine ausfallsichere Datenintegrität bereitzustellen.
-
Sperrenkonvertierung und Eskalation Oracle AI Database führt bei Bedarf eine Sperrenkonvertierung durch.
-
Sperrdauer Oracle AI Database gibt automatisch eine Sperre frei, wenn ein Ereignis eintritt, sodass die Transaktion die Ressource nicht mehr benötigt.
-
Sperren und Deadlocks Ein Deadlock ist eine Situation, in der zwei oder mehr Benutzer darauf warten, dass Daten voneinander gesperrt werden. Deadlocks verhindern, dass einige Transaktionen weiterarbeiten.
Übersicht über das Sperrverhalten
Die Datenbank verwaltet verschiedene Arten von Sperren, je nachdem, welcher Vorgang die Sperre erhalten hat.
Im Allgemeinen verwendet die Datenbank zwei Arten von Sperren: exklusive Sperren und Freigabesperren. Für eine Ressource wie eine Zeile oder eine Tabelle kann nur eine exklusive Sperre abgerufen werden. Für eine einzelne Ressource können jedoch viele Freigabesperren abgerufen werden.
Sperren wirken sich auf die Interaktion von Lesern und Autoren aus. Ein Reader ist eine Abfrage einer Ressource, während ein Writer eine Anweisung ist, die eine Ressource ändert. Die folgenden Regeln fassen das Sperrverhalten von Oracle AI Database für Reader und Writer zusammen:
-
Eine Zeile wird nur gesperrt, wenn sie von einem Writer geändert wurde.
Wenn eine Anweisung eine Zeile aktualisiert, erwirbt die Transaktion nur eine Sperre für diese Zeile. Durch das Sperren von Tabellendaten auf Zeilenebene minimiert die Datenbank Zugriffskonflikte für dieselben Daten. Unter normalen UmständenFußzeile 1 eskaliert die Datenbank keine Zeilensperre an die Block- oder Tabellenebene.
-
Ein Writer einer Zeile blockiert einen gleichzeitigen Writer derselben Zeile.
Wenn eine Transaktion eine Zeile ändert, verhindert eine Zeilensperre, dass eine andere Transaktion dieselbe Zeile gleichzeitig ändert.
-
Ein Leser blockiert nie einen Schriftsteller.
Da ein Reader einer Zeile sie nicht sperrt, kann ein Writer diese Zeile ändern. Die einzige Ausnahme ist eine
SELECT ... FOR UPDATE-Anweisung. Dies ist ein spezieller Typ derSELECT-Anweisung, die does die Zeile sperrt, die sie liest. -
Ein Schriftsteller blockiert nie einen Leser.
Wenn ein Datensatz von einem Writer geändert wird, verwendet die Datenbank Undo-Daten, um den Lesern eine konsistente Ansicht des Datensatzes zu bieten.
Hinweis: Lesevorgänge von Daten müssen möglicherweise in ganz besonderen Fällen ausstehender verteilter Transaktionen auf Schreibvorgänge derselben Datenblöcke warten.
Siehe:
-
Oracle AI Database SQL Language Reference, um mehr über
SELECT ... FOR UPDATEzu erfahren -
Oracle AI Database Administrator's Guide, um mehr über Waits im Zusammenhang mit verteilten zweifelhaften Transaktionen zu erfahren
Verwendung von Sperren
In einer Einzelbenutzerdatenbank sind keine Sperren erforderlich, da nur ein Benutzer Informationen ändert. Wenn jedoch mehrere Benutzer auf Daten zugreifen und diese ändern, muss die Datenbank eine Möglichkeit bieten, eine gleichzeitige Änderung derselben Daten zu verhindern.
Sperren erfüllen die folgenden wichtigen Datenbankanforderungen:
-
Konsistenz
Die Daten, die eine Session anzeigt oder ändert, dürfen erst dann von anderen Sessions geändert werden, wenn der Benutzer fertig ist.
-
Integrität
Die Daten und Strukturen müssen alle an ihnen vorgenommenen Änderungen in der richtigen Reihenfolge wiedergeben.
Oracle AI Database bietet über seine Sperrmechanismen gleichzeitigen Datenzugriff, Konsistenz und Integrität zwischen Transaktionen. Das Sperren erfolgt automatisch und erfordert keine Benutzeraktion.
Die Notwendigkeit von Sperren kann durch eine gleichzeitige Aktualisierung einer einzelnen Zeile veranschaulicht werden. Im folgenden Beispiel stellt eine einfache webbasierte Anwendung dem Endbenutzer eine E-Mail-Adresse und Telefonnummer des Mitarbeiters zur Verfügung. Die Anwendung verwendet eine UPDATE-Anweisung, wie die folgende, um die Daten zu ändern:
UPDATE employees
SET email = ?, phone_number = ?
WHERE employee_id = ?
AND email = ?
AND phone_number = ?
In der vorherigen UPDATE-Anweisung sind die E-Mail- und Telefonnummernwerte in der WHERE-Klausel die ursprünglichen, unveränderten Werte für den angegebenen Mitarbeiter. Mit dieser Aktualisierung wird sichergestellt, dass die von der Anwendung geänderte Zeile nicht geändert wurde, nachdem die Anwendung zuletzt gelesen und dem Benutzer angezeigt wurde. Auf diese Weise vermeidet die Anwendung das verlorene Updateproblem, bei dem ein Benutzer Änderungen überschreibt, die von einem anderen Benutzer vorgenommen wurden, wodurch die Aktualisierung durch den zweiten Benutzer verloren geht (Tabelle 12-2 zeigt ein Beispiel für eine verlorene Aktualisierung). Tabelle 12-4 zeigt die Reihenfolge der Ereignisse, wenn zwei Sessions versuchen, dieselbe Zeile in der Tabelle employees ungefähr gleichzeitig zu ändern.
Tabelle 4: Beispiel für Zeilensperren
| T | Session 1 | Session 2 | Beschreibung |
|---|---|---|---|
| t0 | |
In Sitzung 1 fragt der hr1-Benutzer hr.employees nach dem Himuro-Datensatz ab und zeigt die Attribute employee_id (118), E-Mail (GHIMURO) und Telefonnummer (515.127.4565) an. |
|
| t1 | |
In Sitzung 2 fragt der hr2-Benutzer hr.employees nach dem Himuro-Datensatz ab und zeigt die Attribute employee_id (118), E-Mail (GHIMURO) und Telefonnummer (515.127.4565) an. |
|
| t2 | |
In Session 1 aktualisiert der Benutzer hr1 die Telefonnummer in der Zeile in 515.555.1234, wodurch eine Sperre für die Zeile GHIMURO angefordert wird. |
|
| t3 | |
In Session 2 versucht der Benutzer Das versuchte Update durch |
|
| t4 | |
In Session 1 schreibt der Benutzer Der Commit macht die Änderung für Himuro dauerhaft und entsperrt Sitzung 2, die gewartet hat. |
|
| t5 | |
In Session 2 erkennt der Benutzer Da die Prädikate nicht übereinstimmen, werden in Session 2 keine Datensätze aktualisiert. |
|
| t6 | |
In Sitzung 1 erkennt der Benutzer hr1, dass er die Zeile GHIMURO mit der falschen Telefonnummer aktualisiert hat. Der Benutzer startet eine neue Transaktion und aktualisiert die Telefonnummer in der Zeile in 515.555.1235, wodurch die Zeile GHIMURO gesperrt wird. |
|
| t7 | |
In Sitzung 2 fragt der Benutzer hr2 hr.employees nach dem Himuro-Datensatz ab. Der Datensatz zeigt die von Sitzung 1 festgeschriebene Aktualisierung der Telefonnummer unter t4. Durch die Lesekonsistenz von Oracle AI Database wird sichergestellt, dass die nicht festgeschriebene Änderung in Session 2 unter t6 nicht angezeigt wird. |
|
| t8 | |
In Session 2 versucht der Benutzer hr2, dieselbe Zeile zu aktualisieren, wird jedoch blockiert, weil hr1 die Zeile derzeit verarbeitet. |
|
| t9 | |
In Session 1 rollt der Benutzer hr1 die Transaktion zurück, wodurch sie beendet wird. |
|
| t10 | |
In Sitzung 2 ist die Aktualisierung der Telefonnummer erfolgreich, da das Update für Sitzung 1 zurückgesetzt wurde. Die Zeile GHIMURO stimmt mit ihrem Prädikat überein, sodass die Aktualisierung erfolgreich verläuft. |
|
| t11 | |
Session 2 schreibt die Aktualisierung fest und beendet die Transaktion. |
Bei der Ausführung von SQL-Anweisungen erhält Oracle AI Database automatisch die erforderlichen Sperren. Beispiel: Bevor die Datenbank zulässt, dass eine Session Daten ändert, muss die Session die Daten zunächst sperren. Die Sperre gibt der Session die exklusive Kontrolle über die Daten, sodass keine andere Transaktion die gesperrten Daten ändern kann, bis die Sperre aufgehoben wird.
Da die Sperrmechanismen von Oracle AI Database eng an die Transaktionskontrolle gebunden sind, müssen Anwendungsdesigner Transaktionen nur ordnungsgemäß definieren, und Oracle AI Database verwaltet Sperren automatisch. Benutzer müssen keine Ressourcen explizit sperren, obwohl Benutzer mit Oracle AI Database auch Daten manuell sperren können.
In den folgenden Abschnitten werden Konzepte erläutert, die wichtig sind, um zu verstehen, wie Oracle AI Database den gleichzeitigen Datenzugriff erreicht.
Siehe auch: Oracle AI Database PL/SQL Packages and Types Reference enthält Informationen zum Package OWA_OPT_LOCK, das Unterprogramme enthält, die dazu beitragen können, verlorene Updates zu verhindern.
Sperrmodi
Oracle AI Database verwendet automatisch die niedrigste anwendbare Einschränkungsebene, um den höchsten Grad an gleichzeitigem Datenzugriff bei gesicherter Datenintegration zu gewährleisten.
Je weniger restriktiv die Ebene ist, desto verfügbarer sind die Daten für den Zugriff durch andere Benutzer. Umgekehrt, je restriktiver die Ebene ist, desto begrenzter sind andere Transaktionen in den Arten von Sperren, die sie erwerben können.
Oracle AI Database verwendet zwei Sperrmodi in einer Mehrbenutzerdatenbank:
-
Exklusiver Sperrmodus
In diesem Modus wird verhindert, dass die zugeordnete Ressource freigegeben wird. Eine Transaktion ruft eine exklusive Sperre ab, wenn sie Daten ändert. Die erste Transaktion, mit der eine Ressource exklusiv gesperrt wird, ist die einzige Transaktion, mit der die Ressource geändert werden kann, bis die exklusive Sperre aufgehoben wird.
-
Sperrmodus freigeben
In diesem Modus kann die zugehörige Ressource je nach den beteiligten Vorgängen gemeinsam verwendet werden. Mehrere Benutzer, die Daten lesen, können die Daten gemeinsam nutzen, wobei jeder Benutzer eine Freigabesperre hält, um den gleichzeitigen Zugriff durch einen Writer zu verhindern, der eine exklusive Sperre benötigt. Mehrere Transaktionen können Share-Sperren für dieselbe Ressource anfordern.
Angenommen, eine Transaktion verwendet eine SELECT ... FOR UPDATE-Anweisung, um eine einzelne Tabellenzeile auszuwählen. Die Transaktion erwirbt eine exklusive Zeilensperre und eine Tabellensperre für Zeilenfreigaben. Mit der Zeilensperre können andere Sessions Zeilen ändern, außer der gesperrten Zeile, während die Tabellensperre verhindert, dass Sessions die Struktur der Tabelle ändern. Somit kann die Datenbank so viele Anweisungen wie möglich ausführen.
Konvertierung und Eskalation sperren
Oracle AI Database führt bei Bedarf eine Sperrenkonvertierung durch.
Bei der Lock-Konvertierung konvertiert die Datenbank automatisch eine Tabellensperre mit geringerer Einschränkung in eine höhere Einschränkung. Beispiel: Eine Transaktion gibt eine SELECT ... FOR UPDATE für einen Mitarbeiter aus und aktualisiert die gesperrte Zeile später. In diesem Fall konvertiert die Datenbank die Zeilenfreigabetabellensperre automatisch in eine Zeilensperre. Eine Transaktion enthält exklusive Zeilensperren für alle Zeilen, die in die Transaktion eingefügt, aktualisiert oder gelöscht wurden. Da Zeilensperren mit dem höchsten Grad an Einschränkung erfasst werden, ist keine Sperrkonvertierung erforderlich oder erfolgt.
Die Sperrkonvertierung unterscheidet sich von der Sperreskalation, die auftritt, wenn zahlreiche Sperren auf einer Granularitätsebene gehalten werden (z.B. Zeilen) und eine Datenbank die Sperren auf eine höhere Granularitätsebene erhöht (z.B. Tabelle). Wenn eine Session viele Zeilen in einer Tabelle sperrt, eskalieren einige Datenbanken die Zeilensperren automatisch an eine einzelne Tabelle. Die Anzahl der Sperren nimmt ab, aber die Einschränkung dessen, was gesperrt ist, nimmt zu.
Oracle AI Database eskaliert nie Sperren. Lock-Eskalation erhöht die Wahrscheinlichkeit von Deadlocks erheblich. Angenommen, ein System versucht, Sperren im Namen von Transaktion 1 zu eskalieren, dies ist jedoch aufgrund der Sperren von Transaktion 2 nicht möglich. Ein Deadlock wird erstellt, wenn Transaktion 2 auch eine Lock-Eskalation derselben Daten erfordert, bevor sie fortgesetzt werden kann.
Sperrdauer
Oracle AI Database gibt automatisch eine Sperre frei, wenn ein Ereignis eintritt, sodass die Transaktion die Ressource nicht mehr benötigt.
In der Regel enthält die Datenbank Sperren, die von Anweisungen innerhalb einer Transaktion für die Dauer der Transaktion erworben wurden. Diese Sperren verhindern destruktive Störungen wie schmutzige Lesevorgänge, verlorene Updates und destruktive DDL aus gleichzeitigen Transaktionen. Hinweis: Eine Tabellensperre, die für eine untergeordnete Tabelle aufgrund eines nicht indizierten Fremdschlüssels vorgenommen wurde, wird für die Dauer der Anweisung und nicht für die Transaktion gehalten. Darüber hinaus ermöglicht das Package DBMS_LOCK, dass benutzerdefinierte Sperren nach Belieben freigegeben und zugewiesen und sogar über Transaktionsgrenzen hinweg gehalten werden können.
Oracle AI Database gibt alle Sperren frei, die von den Anweisungen innerhalb einer Transaktion erworben wurden, wenn sie festgeschrieben oder zurückgesetzt werden. Oracle AI Database gibt auch Sperren frei, die nach einem Savepoint erworben wurden, wenn ein Rollback zum Savepoint durchgeführt wird. Allerdings können nur Transaktionen, die nicht auf die zuvor gesperrten Ressourcen warten, Sperren für die jetzt verfügbaren Ressourcen anfordern. Wartende Transaktionen warten weiter, bis die ursprüngliche Transaktion festgeschrieben oder vollständig zurückgesetzt wurde.
Siehe:
-
"Tabelle 13-3", die das Warteverhalten von Transaktionen anzeigt
-
"Überblick über benutzerdefinierte Sperren", um mehr über
DBMS_LOCKzu erfahren
Sperren und Deadlocks
Ein Deadlock ist eine Situation, in der zwei oder mehr Benutzer auf Daten warten, die voneinander gesperrt sind. Deadlocks verhindern, dass einige Transaktionen weiterarbeiten.
Oracle AI Database erkennt Deadlocks automatisch und löst sie auf, indem eine Anweisung, die am Deadlock beteiligt ist, zurückgesetzt wird und eine Gruppe der widersprüchlichen Zeilensperren freigegeben wird. Die Datenbank gibt eine entsprechende Meldung an die Transaktion zurück, für die ein Rollback auf Anweisungsebene durchgeführt wird. Die zurückgerollte Anweisung gehört zu der Transaktion, die den Deadlock erkennt. Normalerweise sollte die signalisierte Transaktion explizit zurückgerollt werden. Sie kann jedoch die zurückgerollte Anweisung wiederholen, nachdem sie gewartet hat. In Tabelle 12-5 werden zwei Transaktionen in einem Deadlock dargestellt.
Tabelle 5: Transaktionen mit Deadlock
| T | Session 1 | Session 2 | Erläuterung |
|---|---|---|---|
| t0 | |
|
Sitzung 1 startet Transaktion 1 und aktualisiert das Gehalt für Mitarbeiter 100. Sitzung 2 startet Transaktion 2 und aktualisiert das Gehalt für Mitarbeiter 200. Kein Problem, da jede Transaktion nur die Zeile sperrt, die aktualisiert werden soll. |
| t1 | |
|
Transaktion 1 versucht, die Zeile "Mitarbeiter 200" zu aktualisieren, die derzeit durch Transaktion 2 gesperrt ist. Transaktion 2 versucht, die Zeile "Mitarbeiter 100" zu aktualisieren, die derzeit durch Transaktion 1 gesperrt ist. Ein Deadlock führt dazu, dass keine Transaktion die Ressource abrufen kann, die sie zum Fortfahren oder Beenden benötigt. Unabhängig davon, wie lange jede Transaktion wartet, werden die widersprüchlichen Sperren gehalten. |
| t2 | |
Transaktion 1 signalisiert den Deadlock und rollt die unter t1 ausgegebene Hinweis: Nur eine Session im Deadlock erhält den Deadlock-Fehler, aber jede Session kann den Fehler erhalten. |
|
| t3 | |
Session 1 schreibt die unter t0 vorgenommene Aktualisierung fest und beendet Transaktion 1. Das unter t1 erfolglose Update wurde nicht festgeschrieben. | |
| t4 | |
Das Update unter t1 in Transaktion 2, das von Transaktion 1 blockiert wurde, wird ausgeführt. Die Eingabeaufforderung wird zurückgegeben. | |
| t5 | |
Session 2 schreibt die Aktualisierungen fest, die unter t0 und t1 vorgenommen wurden, wodurch Transaktion 2 beendet wird. |
Deadlocks treten am häufigsten auf, wenn Transaktionen die Standardsperre von Oracle AI Database explizit außer Kraft setzen. Da Oracle AI Database keine Sperren eskaliert und keine Lesesperren für Abfragen verwendet, sondern Sperren auf Zeilenebene (und nicht auf Seitenebene) verwendet, treten Deadlocks selten auf.
Siehe:
-
Oracle AI Database Development Guide enthält Informationen zum Umgang mit Deadlocks, wenn Sie Tabellen explizit sperren
Automatische Sperren - Überblick
Oracle AI Database sperrt eine Ressource automatisch im Namen einer Transaktion, um zu verhindern, dass andere Transaktionen etwas tun, das exklusiven Zugriff auf dieselbe Ressource erfordert.
Die Datenbank erwirbt automatisch verschiedene Arten von Sperren auf unterschiedlichen Einschränkungsebenen, abhängig von der Ressource und dem ausgeführten Vorgang. Hinweis: Die Datenbank sperrt beim Ausführen einfacher Lesevorgänge keine Zeilen.
Oracle AI Database-Sperren sind in die Kategorien unterteilt, die in der folgenden Tabelle angezeigt werden.
Tabelle 6: Sperrkategorien
| Sperren | Beschreibung | Weitere Infos |
|---|---|---|
| DML-Sperren | Daten schützen Beispiel: Tabellensperren sperren ganze Tabellen, während Zeilensperren ausgewählte Zeilen sperren. | "DML-Sperren" |
| DDL-Sperren | Schützen Sie die Struktur von Schemaobjekten. Beispiel: Dictionary-Definitionen von Tabellen und Views. | "DDL-Sperren" |
| Systemsperren | Schützen Sie interne Datenbankstrukturen wie Datendateien. Riegel, Mutexe und interne Schlösser sind vollautomatisch. | "Systemsperren" |
-
DML-Sperren Eine DML-Sperre, die auch als Datensperre bezeichnet wird, garantiert die Integrität von Daten, auf die mehrere Benutzer gleichzeitig zugreifen.
-
DDL-Sperren Eine DDL-Sperre schützt die Definition eines Schemaobjekts, während ein fortlaufender DDL-Vorgang das Objekt bearbeitet oder referenziert.
-
Systemsperren Oracle AI Database verwendet verschiedene Arten von Systemsperren, um interne Datenbank- und Speicherstrukturen zu schützen. Auf diese Mechanismen kann nicht zugegriffen werden, da Benutzer keine Kontrolle über ihr Auftreten oder ihre Dauer haben.
DML-Sperren
Eine DML-Sperre, die auch als Datensperre bezeichnet wird, garantiert die Integrität von Daten, auf die mehrere Benutzer gleichzeitig zugreifen.
Zum Beispiel verhindert eine DML-Sperre, dass zwei Kunden die letzte Kopie eines Buches kaufen, das von einem Online-Buchhändler verfügbar ist. DML-Sperren verhindern destruktive Interferenzen gleichzeitiger widersprüchlicher DML- oder DDL-Vorgänge.
DML-Anweisungen erfassen automatisch die folgenden Arten von Sperren:
In den folgenden Abschnitten ist das Akronym in Klammern nach jedem Sperr- oder Sperrmodus die Abkürzung, die im Sperrmonitor von Oracle Enterprise Manager (Enterprise Manager) verwendet wird. Enterprise Manager kann TM für eine Tabellensperre anzeigen, anstatt den Modus der Tabellensperre (wie RS oder SRX) anzugeben.
-
Zeilensperren (TX) Eine Zeilensperre, die auch als TX-Sperre bezeichnet wird, ist eine Sperre für eine einzelne Tabellenzeile. Eine Transaktion erwirbt eine Zeilensperre für jede Zeile, die von einer
INSERT-,UPDATE-,DELETE-,MERGE- oderSELECT... FORUPDATE-Anweisung geändert wurde. Die Zeilensperre ist vorhanden, bis die Transaktion festgeschrieben oder zurückgesetzt wird. -
Tabellensperren (TM) Eine Tabellensperre, auch TM-Sperre genannt, wird von einer Transaktion angefordert, wenn eine Tabelle von einer
INSERT-,UPDATE-,DELETE-,MERGE-,SELECT- oderLOCK TABLE-Anweisung mit derFOR UPDATE-Klausel geändert wird. -
Sperren und Fremdschlüssel Oracle AI Database maximiert die Nebenläufigkeitskontrolle übergeordneter Schlüssel in Bezug auf abhängige Fremdschlüssel.
Zeilensperren (TX)
Eine Zeilensperre, die auch als TX-Sperre bezeichnet wird, ist eine Sperre für eine einzelne Tabellenzeile. Eine Transaktion erwirbt eine Zeilensperre für jede Zeile, die von einer INSERT-, UPDATE-, DELETE-, MERGE- oder SELECT ... FOR UPDATE-Anweisung geändert wurde. Die Zeilensperre ist vorhanden, bis die Transaktion festgeschrieben oder zurückgesetzt wird.
Zeilensperren dienen in erster Linie als Queuing-Mechanismus, um zu verhindern, dass zwei Transaktionen dieselbe Zeile ändern. Die Datenbank sperrt eine geänderte Zeile immer im exklusiven Modus, sodass andere Transaktionen die Zeile erst ändern können, wenn die Transaktion mit der Sperre festgeschrieben oder zurückgesetzt wird. Die Zeilensperrung bietet die bestmögliche Kornsperre und bietet so den bestmöglichen gleichzeitigen Zugriff und Durchsatz.
Hinweis: Wenn eine Transaktion aufgrund eines Instanzfehlers der Datenbank beendet wird, stellt das Recovery auf Blockebene eine Zeile zur Verfügung, bevor die gesamte Transaktion wiederhergestellt wird.
Wenn eine Transaktion eine Sperre für eine Zeile erhält, erwirbt die Transaktion auch eine Sperre für die Tabelle, die diese Zeile enthält. Die Tabellensperre verhindert unvereinbare DDL-Vorgänge, die Datenänderungen in einer aktuellen Transaktion außer Kraft setzen würden. In Abbildung 12-2 wird eine Aktualisierung der dritten Zeile in einer Tabelle dargestellt. Oracle AI Database setzt automatisch eine exklusive Sperre für die aktualisierte Zeile und eine subexklusive Sperre für die Tabelle.
Abbildung 2: Zeilen- und Tabellensperren

Beschreibung der Abbildung cncpt265.gif
-
Zeilensperren und Nebenläufigkeit Dieses Szenario veranschaulicht, wie Oracle AI Database Zeilensperren für den gleichzeitigen Zugriff verwendet.
-
Speicher von Zeilensperren Im Gegensatz zu einigen Datenbanken, die eine Liste der Sperren im Speicher mit einem Lock Manager verwalten, speichert Oracle AI Database Sperrinformationen im Datenblock, der die gesperrte Zeile enthält.
Zeilensperren und Nebenläufigkeit
Dieses Szenario veranschaulicht, wie Oracle AI Database Zeilensperren für den gleichzeitigen Zugriff verwendet.
Drei Sessions fragen dieselben Zeilen gleichzeitig ab. Session 1 und 2 nehmen weiterhin nicht festgeschriebene Aktualisierungen an verschiedenen Zeilen vor, während Session 3 keine Aktualisierungen vornimmt. Jede Sitzung sieht ihre eigenen nicht festgeschriebenen Aktualisierungen, aber nicht die nicht festgeschriebenen Aktualisierungen einer anderen Sitzung.
Tabelle 7: Gleichzeitiger Datenzugriff - Beispiel
| T | Session 1 | Session 2 | Session 3 | Erläuterung |
|---|---|---|---|---|
| t0 | |
|
|
Drei verschiedene Sitzungen fragen gleichzeitig die Personalnummer und das Gehalt der Angestellten 100 und 101 ab. Die von jeder Abfrage zurückgegebenen Ergebnisse sind identisch. |
| t1 | |
Sitzung 1 aktualisiert das Gehalt von Mitarbeiter 100, wird jedoch nicht festgeschrieben. Bei der Aktualisierung erwirbt der Writer nur für die aktualisierte Zeile eine Sperre auf Zeilenebene, wodurch andere Writer daran gehindert werden, diese Zeile zu ändern. | ||
| t2 | |
|
|
Jede Session setzt gleichzeitig die ursprüngliche Abfrage ab. Sitzung 1 zeigt das Gehalt von 612, das sich aus der Aktualisierung t1 ergibt. Die Reader in Session 2 und 3 geben Zeilen sofort zurück und warten nicht, bis Session 1 die Transaktion beendet. Die Datenbank verwendet die Multiversions-Lesekonsistenz, um das Gehalt so anzuzeigen, wie es vor der Aktualisierung in Sitzung 1 vorhanden war. |
| t3 | |
Sitzung 2 aktualisiert das Gehalt von Mitarbeiter 101, schreibt die Transaktion jedoch nicht fest. Bei der Aktualisierung erwirbt der Writer eine Sperre auf Zeilenebene nur für die aktualisierte Zeile, sodass andere Writer diese Zeile nicht ändern können. | ||
| t4 | |
|
|
Jede Session setzt gleichzeitig die ursprüngliche Abfrage ab. Sitzung 1 zeigt das Gehalt von 612, das sich aus der Aktualisierung t1 ergibt, nicht aber die Gehaltsaktualisierung für Mitarbeiter 101, die in Sitzung 2 vorgenommen wurde. Der Leser in Sitzung 2 zeigt die in Sitzung 2 vorgenommene Gehaltsaktualisierung an, nicht jedoch die in Sitzung 1 vorgenommene Gehaltsaktualisierung. Der Reader in Sitzung 3 verwendet Lesekonsistenz, um die Gehälter vor der Änderung durch Sitzung 1 und 2 anzuzeigen. |
Siehe:
-
Oracle AI Database Reference, um mehr über
V$LOCKzu erfahren
Speicherung von Zeilensperren
Im Gegensatz zu einigen Datenbanken, die mit einem Lock Manager eine Liste von Sperren im Speicher verwalten, speichert Oracle AI Database Sperrinformationen im Datenblock, der die gesperrte Zeile enthält.
Die Datenbank verwendet einen Queuing-Mechanismus zum Erfassen von Zeilensperren. Wenn für eine Transaktion eine Sperre für eine entsperrte Zeile erforderlich ist, setzt die Transaktion eine Sperre im Datenblock. Jede von dieser Transaktion geänderte Zeile verweist auf eine Kopie der Transaktions-ID, die im Blockheader gespeichert ist.
Wenn eine Transaktion endet, bleibt die Transaktions-ID im Blockheader. Wenn eine andere Transaktion eine Zeile ändern möchte, verwendet sie die Transaktions-ID, um zu bestimmen, ob die Sperre aktiv ist. Wenn die Sperre aktiv ist, fordert die Session Sie auf, benachrichtigt zu werden, wenn die Sperre aufgehoben wird. Andernfalls erwirbt die Transaktion die Sperre.
Siehe:
-
"Überblick über Datenblöcke", um mehr über den Datenblockheader zu erfahren
-
Oracle AI Database Reference, um mehr über
V$TRANSACTIONzu erfahren
Tabellensperren (TM)
Eine Tabellensperre, auch TM-Sperre genannt, wird von einer Transaktion angefordert, wenn eine Tabelle durch eine INSERT-, UPDATE-, DELETE-, MERGE-, SELECT- oder LOCK TABLE-Anweisung mit der FOR UPDATE-Klausel geändert wird.
Für DML-Vorgänge sind Tabellensperren erforderlich, um den DML-Zugriff auf die Tabelle im Namen einer Transaktion zu reservieren und DDL-Vorgänge zu verhindern, die mit der Transaktion in Konflikt stehen.
Eine Tabellensperre kann in einem der folgenden Modi gehalten werden:
-
Zeilenfreigabe (RS)
Diese Sperre, die auch als Subshare-Tabellensperre (SS) bezeichnet wird, gibt an, dass die Transaktion mit der Sperre für die Tabelle gesperrte Zeilen in der Tabelle enthält und diese aktualisieren soll. Eine Zeilenfreigabesperre ist der am wenigsten restriktive Modus der Tabellensperre und bietet den höchsten Grad an gleichzeitigem Zugriff für eine Tabelle.
-
Zeilenexklusive Tabellensperre (RX)
Diese Sperre, die auch als subexclusive table lock (SX) bezeichnet wird, gibt im Allgemeinen an, dass die Transaktion, die diese Sperre hält, aktualisierte Tabellenzeilen enthält oder
SELECT ... FOR UPDATEabgesetzt hat. Mit einer SX-Sperre können andere Transaktionen Zeilen in derselben Tabelle gleichzeitig abfragen, einfügen, aktualisieren, löschen oder sperren. Daher ermöglichen SX-Sperren, dass mehrere Transaktionen gleichzeitig SX- und Subshare-Tabellensperren für dieselbe Tabelle erhalten. -
Tabellensperre freigeben (S)
Durch eine von einer Transaktion gehaltene Tabellensperre für gemeinsame Nutzung können andere Transaktionen die Tabelle abfragen (ohne
SELECT ... FOR UPDATEzu verwenden). Aktualisierungen sind jedoch nur zulässig, wenn eine einzelne Transaktion die Tabellensperre für gemeinsame Nutzung enthält. Da mehrere Transaktionen eine gemeinsame Tabellensperre gleichzeitig enthalten können, reicht das Halten dieser Sperre nicht aus, um sicherzustellen, dass eine Transaktion die Tabelle ändern kann. -
Zeilensperre gemeinsam verwenden (SRX)
Diese Sperre, die auch als share-subexclusive table lock (SSX) bezeichnet wird, ist restriktiver als eine Sperre für die gemeinsame Nutzungstabelle. Es kann jeweils nur eine Transaktion eine SSX-Sperre für eine bestimmte Tabelle anfordern. Mit einer SSX-Sperre, die von einer Transaktion gehalten wird, können andere Transaktionen die Tabelle abfragen (außer
SELECT ... FOR UPDATE), die Tabelle jedoch nicht aktualisieren. -
Exklusive Tischsperre (X)
Diese Sperre ist am restriktivsten und verhindert, dass andere Transaktionen irgendeine Art von DML-Anweisung ausführen oder eine beliebige Art von Sperre auf die Tabelle setzen.
Siehe:
-
Oracle AI Database Development Guide, um mehr über Tabellensperren zu erfahren
Sperren und Fremdschlüssel
Oracle AI Database maximiert die Nebenläufigkeitskontrolle übergeordneter Schlüssel in Bezug auf abhängige Fremdschlüssel.
Das Sperrverhalten hängt davon ab, ob Fremdschlüsselspalten indiziert sind. Wenn Fremdschlüssel nicht indiziert sind, wird die untergeordnete Tabelle wahrscheinlich häufiger gesperrt, Deadlocks treten auf, und der gleichzeitige Zugriff wird verringert. Aus diesem Grund sollten Fremdschlüssel fast immer indiziert werden. Die einzige Ausnahme ist, wenn der übereinstimmende eindeutige Schlüssel oder Primärschlüssel nie aktualisiert oder gelöscht wird.
-
Sperren und nicht indizierte Fremdschlüssel Die Datenbank erwirbt eine vollständige Tabellensperre für die untergeordnete Tabelle, wenn kein Index für die Fremdschlüsselspalte der untergeordneten Tabelle vorhanden ist. Eine Session ändert einen Primärschlüssel in der übergeordneten Tabelle (z.B. löscht eine Zeile oder ändert Primärschlüsselattribute) oder führt Zeilen in der übergeordneten Tabelle zusammen.
-
Sperren und indizierte Fremdschlüssel Die Datenbank fordert keine vollständige Tabellensperre für die untergeordnete Tabelle an, wenn eine Fremdschlüsselspalte in der untergeordneten Tabelle indiziert wird, und eine Session einen Primärschlüssel in der übergeordneten Tabelle ändert (z.B. eine Zeile löscht oder Primärschlüsselattribute ändert) oder Zeilen in der übergeordneten Tabelle zusammenführt.
Sperren und nicht indizierte Fremdschlüssel
Die Datenbank erwirbt eine vollständige Tabellensperre für die untergeordnete Tabelle, wenn kein Index für die Fremdschlüsselspalte der untergeordneten Tabelle vorhanden ist. Eine Session ändert einen Primärschlüssel in der übergeordneten Tabelle (z.B. löscht eine Zeile oder ändert Primärschlüsselattribute) oder führt Zeilen in der übergeordneten Tabelle zusammen.
Wenn beide der folgenden Bedingungen zutreffen, erwirbt die Datenbank eine vollständige Tabellensperre für die untergeordnete Tabelle:
-
Für die Fremdschlüsselspalte der untergeordneten Tabelle ist kein Index vorhanden.
-
Eine Session ändert einen Primärschlüssel in der übergeordneten Tabelle (z.B. löscht eine Zeile oder ändert Primärschlüsselattribute) oder führt Zeilen in der übergeordneten Tabelle zusammen. Hinweis: Beim Einfügen in die übergeordnete Tabelle werden keine Sperrtabellensperren angefordert, die DML in der untergeordneten Tabelle verhindern. Bei Einfügungen erwirbt die Datenbank eine Sperre für die untergeordnete Tabelle, die strukturelle Änderungen verhindert, jedoch keine Änderungen vorhandener oder neu hinzugefügter Zeilen.
Angenommen, die Tabelle hr.departments ist ein übergeordnetes Element von hr.employees, das den nicht indizierten Fremdschlüssel employees.department_id enthält. Die folgende Abbildung zeigt eine Session, in der die Primärschlüsselattribute von Abteilung 60 in der Tabelle departments geändert werden.
Abbildung 3: Sperrmechanismen mit nicht indiziertem Fremdschlüssel

Beschreibung der Abbildung cncpt308.gif
In Abbildung 12-3 erwirbt die Datenbank während der Primärschlüsseländerung von Abteilung 60 eine vollständige Tabellensperre für employees. Mit dieser Sperre können andere Sessions die Tabelle employees abfragen, jedoch nicht aktualisieren. Beispiel: Veranstaltungen können keine Telefonnummern von Mitarbeitern aktualisieren. Die Tabellensperre für employees wird sofort freigegeben, nachdem die Änderung des Primärschlüssels in der Tabelle departments abgeschlossen wurde. Wenn mehrere Zeilen in departments Primärschlüsseländerungen durchlaufen, wird für jede in departments geänderte Zeile eine Tabellensperre für employees abgerufen und einmal freigegeben. Hinweis: DML für eine untergeordnete Tabelle fordert keine Tabellensperre für die übergeordnete Tabelle an.
Sperren und indizierte Fremdschlüssel
Die Datenbank fordert keine vollständige Tabellensperre für die untergeordnete Tabelle an, wenn eine Fremdschlüsselspalte in der untergeordneten Tabelle indiziert wird, und eine Session einen Primärschlüssel in der übergeordneten Tabelle ändert (z.B. eine Zeile löscht oder Primärschlüsselattribute ändert) oder Zeilen in der übergeordneten Tabelle zusammenführt.
Eine Sperre der übergeordneten Tabelle verhindert, dass Transaktionen exklusive Tabellensperren erhalten. DML in der übergeordneten oder untergeordneten Tabelle wird jedoch bei der Änderung des Primärschlüssels nicht verhindert. Diese Situation ist vorzuziehen, wenn Primärschlüsseländerungen in der übergeordneten Tabelle auftreten, während Aktualisierungen in der untergeordneten Tabelle vorgenommen werden. In Abbildung 12-4 ist die untergeordnete Tabelle employees mit einer indizierten Spalte department_id dargestellt. Bei einer Transaktion wird Abteilung 280 aus departments gelöscht. Dieser Löschvorgang führt nicht dazu, dass die Datenbank eine vollständige Tabellensperre für die Tabelle employees anfordert, wie in dem unter Sperren und nicht indizierte Fremdschlüssel beschriebenen Szenario beschrieben.
Abbildung 4: Sperrmechanismen mit indiziertem Fremdschlüssel

Beschreibung der Abbildung cncpt309.gif
Wenn die untergeordnete Tabelle ON DELETE CASCADE angibt, können Löschvorgänge aus der übergeordneten Tabelle zu Löschvorgängen aus der untergeordneten Tabelle führen. Beispiel: Das Löschen von Abteilung 280 kann dazu führen, dass Datensätze für Mitarbeiter in der gelöschten Abteilung aus employees gelöscht werden. In diesem Fall sind Warte- und Sperrregeln identisch mit denen, die Sie nach dem Löschen von Zeilen aus der übergeordneten Tabelle aus der untergeordneten Tabelle gelöscht haben.
Siehe:
DDL-Sperren
Eine DDL-(Data Dictionary-)Sperre schützt die Definition eines Schemaobjekts, während ein fortlaufender DDL-Vorgang das Objekt bearbeitet oder referenziert.
Nur einzelne Schemaobjekte, die geändert oder referenziert werden, werden während DDL-Vorgängen gesperrt. Die Datenbank sperrt nie das gesamte Data Dictionary.
Oracle AI Database erwirbt automatisch eine DDL-Sperre im Namen jeder DDL-Transaktion, die sie benötigt. Benutzer können DDL-Sperren nicht explizit anfordern. Beispiel: Wenn ein Benutzer eine gespeicherte Prozedur erstellt, erwirbt Oracle AI Database automatisch DDL-Sperren für alle Schemaobjekte, die in der Prozedurdefinition referenziert werden. Die DDL-Sperren verhindern, dass diese Objekte geändert oder gelöscht werden, bevor die Kompilierung der Prozedur abgeschlossen ist.
-
Exklusive DDL-Sperren Eine exklusive DDL-Sperre verhindert, dass andere Sessions eine DDL- oder DML-Sperre erhalten.
-
DDL-Sperren freigeben Eine Freigabe-DDL-Sperre für eine Ressource verhindert destruktive Interferenzen mit unvereinbaren DDL-Vorgängen, ermöglicht jedoch den gleichzeitigen Datenzugriff für ähnliche DDL-Vorgänge.
-
Auflösbare Parse-Sperren Eine Parse-Sperre wird von einer SQL-Anweisung oder PL/SQL-Programmeinheit für jedes Schemaobjekt gehalten, das sie referenziert.
Exklusive DDL-Sperren
Eine exklusive DDL-Sperre verhindert, dass andere Sessions eine DDL- oder DML-Sperre erhalten.
Die meisten DDL-Vorgänge erfordern exklusive DDL-Sperren für eine Ressource, um destruktive Störungen mit anderen DDL-Vorgängen zu verhindern, die dasselbe Schemaobjekt ändern oder referenzieren könnten. Beispiel: DROP TABLE darf eine Tabelle nicht löschen, während ALTER TABLE ihr eine Spalte hinzufügt, und umgekehrt.
Exklusive DDL-Sperren dauern die Dauer der Ausführung von DDL-Anweisungen und des automatischen Commits. Wenn beim Erwerb einer exklusiven DDL-Sperre eine weitere DDL-Sperre für das Schemaobjekt durch einen anderen Vorgang gehalten wird, wartet die Erfassung, bis die ältere DDL-Sperre freigegeben wird, und fährt dann fort.
Siehe auch: "DDL-Sperren freigeben" beschreibt Situationen, in denen exklusive Sperren nicht erforderlich sind, um destruktive Störungen zu verhindern.
DDL-Sperren freigeben
Eine Freigabe-DDL-Sperre für eine Ressource verhindert destruktive Interferenzen mit unvereinbaren DDL-Vorgängen, ermöglicht jedoch den gleichzeitigen Datenzugriff für ähnliche DDL-Vorgänge.
Beispiel: Wenn eine CREATE PROCEDURE-Anweisung ausgeführt wird, erwirbt die enthaltende Transaktion gemeinsame DDL-Sperren für alle referenzierten Tabellen. Andere Transaktionen können gleichzeitig Prozeduren erstellen, die dieselben Tabellen referenzieren und gleichzeitig DDL-Sperren für gemeinsame Nutzung für dieselben Tabellen anfordern. Keine Transaktion kann jedoch eine exklusive DDL-Sperre für eine referenzierte Tabelle anfordern.
Eine Freigabe-DDL-Sperre dauert die Dauer der Ausführung von DDL-Anweisungen und des automatischen Commits. Somit wird eine Transaktion mit einer DDL-Freigabesperre gewährleistet, dass die Definition des referenzierten Schemaobjekts während der Transaktion konstant bleibt.
Aufbrechbare Parse-Sperren
Eine Parse-Sperre wird von einer SQL-Anweisung oder PL/SQL-Programmeinheit für jedes Schemaobjekt gehalten, das sie referenziert.
Parse-Sperren werden angefordert, sodass der zugehörige gemeinsam verwendete SQL-Bereich invalidiert werden kann, wenn ein referenziertes Objekt geändert oder gelöscht wird. Eine Parse-Sperre wird als breakable parse lock bezeichnet, da sie keine DDL-Vorgänge zulässt und unterbrochen werden kann, um widersprüchliche DDL-Vorgänge zuzulassen.
Während der Parse-Phase der Ausführung von SQL-Anweisungen wird im Shared Pool eine Parse-Sperre angefordert. Die Sperre wird gehalten, solange der Shared SQL-Bereich für diese Anweisung im Shared Pool verbleibt.
Siehe auch: "Shared Pool"
Systemsperren
Oracle AI Database verwendet verschiedene Arten von Systemsperren, um interne Datenbank- und Speicherstrukturen zu schützen. Auf diese Mechanismen kann nicht zugegriffen werden, da Benutzer keine Kontrolle über ihr Auftreten oder ihre Dauer haben.
-
Latches Ein Latch ist ein einfacher Serialisierungsmechanismus auf niedriger Ebene, der den Mehrbenutzerzugriff auf gemeinsame Datenstrukturen, Objekte und Dateien koordiniert.
-
Mutexe Ein gegenseitiges Ausschlussobjekt (mutex) ist ein Mechanismus auf niedriger Ebene, der verhindert, dass ein Objekt im Speicher beim Zugriff durch gleichzeitige Prozesse ausfällt oder beschädigt wird. Ein Mutex ähnelt einem Latch, während ein Latch normalerweise eine Gruppe von Objekten schützt, schützt ein Mutex ein einzelnes Objekt.
-
Interne Sperren Interne Sperren sind komplexere Mechanismen auf höherer Ebene als Latches und Mutexe und dienen verschiedenen Zwecken.
Latches
Ein Latch ist ein einfacher Serialisierungsmechanismus auf niedriger Ebene, der den Mehrbenutzerzugriff auf gemeinsame Datenstrukturen, Objekte und Dateien koordiniert.
Latches schützen Shared Memory-Ressourcen vor Beschädigung, wenn mehrere Prozesse auf sie zugreifen. Insbesondere schützen Latches Datenstrukturen vor den folgenden Situationen:
-
Gleichzeitige Änderung durch mehrere Sitzungen
-
Wird von einer Session gelesen, während sie von einer anderen Session geändert wird
-
Speicherzuweisung (Auslagerung) während des Zugriffs aufheben
In der Regel schützt ein einzelner Latch mehrere Objekte in der SGA. Beispiel: Hintergrundprozesse wie DBW und LGWR weisen Speicher aus dem Shared Pool zu, um Datenstrukturen zu erstellen. Um diesen Speicher zuzuweisen, verwenden diese Prozesse einen Shared Pool-Latch, der den Zugriff serialisiert, um zu verhindern, dass zwei Prozesse versuchen, den Shared Pool gleichzeitig zu prüfen oder zu ändern. Nachdem der Speicher zugewiesen wurde, müssen andere Prozesse möglicherweise auf Shared Pool-Bereiche zugreifen, wie den Bibliothekscache, der für das Parsen erforderlich ist. In diesem Fall verriegeln Prozesse nur den Library-Cache, nicht den gesamten Shared Pool.
Im Gegensatz zu Enqueue-Latches wie Zeilensperren lassen Latches keine Sessions in die Queue zu. Wenn ein Latch verfügbar wird, erhält die erste Session, die den Latch anfordert, exklusiven Zugriff darauf. Das Phänomen Latch Spinning tritt auf, wenn ein Prozess wiederholt einen Latch in einer Schleife anfordert, während Latch Sleep auftritt, wenn ein Prozess die CPU freigibt, bevor die Latch-Anforderung erneuert wird.
In der Regel erwirbt ein Oracle-Prozess einen Latch für eine extrem kurze Zeit, während er eine Datenstruktur bearbeitet oder betrachtet. Beispiel: Bei der Verarbeitung einer Gehaltsaktualisierung eines einzelnen Mitarbeiters kann die Datenbank Tausende von Latches abrufen und freigeben. Die Implementierung von Latches ist betriebssystemabhängig, insbesondere in Bezug darauf, ob und wie lange ein Prozess auf einen Latch wartet.
Eine Erhöhung der Verriegelung bedeutet eine Verringerung der Nebenläufigkeit. Beispiel: Bei übermäßigen Hard Parse-Vorgängen wird ein Konflikt für den Library-Cache-Latch erstellt. Die View V$LATCH enthält detaillierte Statistiken zur Latch-Nutzung für jeden Latch, einschließlich der Häufigkeit, mit der jeder Latch angefordert und gewartet wurde.
Siehe:
-
Oracle AI Database Reference, um mehr über
V$LATCHzu erfahren -
Oracle AI Database Performance Tuning Guide für Informationen zu Wait-Ereignisstatistiken
Mutexe
Ein gegenseitiges Ausschlussobjekt (mutex) ist ein Mechanismus auf niedriger Ebene, der verhindert, dass ein Objekt im Speicher beim Zugriff durch nebenläufige Prozesse veraltet oder beschädigt wird. Ein Mutex ähnelt einem Latch, während ein Latch normalerweise eine Gruppe von Objekten schützt, schützt ein Mutex ein einzelnes Objekt.
Mutexe bieten mehrere Vorteile:
-
Ein Mutex kann die Möglichkeit von Konflikten reduzieren.
Da ein Latch mehrere Objekte schützt, kann es zu einem Engpass werden, wenn Prozesse versuchen, gleichzeitig auf eines dieser Objekte zuzugreifen. Durch die Serialisierung des Zugriffs auf ein einzelnes Objekt und nicht auf eine Gruppe erhöht ein Mutex die Verfügbarkeit.
-
Ein Mutex verbraucht weniger Speicher als ein Latch.
-
Im Shared-Modus erlaubt ein Mutex die gleichzeitige Referenzierung durch mehrere Sessions.
Interne Sperren
Interne Sperren sind komplexere Mechanismen auf höherer Ebene als Verriegelungen und Mutexe und dienen verschiedenen Zwecken.
Die Datenbank verwendet die folgenden Arten von internen Sperren:
-
Dictionary-Cache-Sperren
Diese Sperren sind sehr kurz und werden für Einträge in Dictionary-Caches gehalten, während die Einträge geändert oder verwendet werden. Sie stellen sicher, dass Anweisungen, die geparst werden, keine inkonsistenten Objektdefinitionen sehen. Dictionary-Cache-Sperren können gemeinsam verwendet oder exklusiv verwendet werden. Gemeinsame Sperren werden freigegeben, wenn der Parsevorgang abgeschlossen ist, während exklusive Sperren freigegeben werden, wenn der DDL-Vorgang abgeschlossen ist.
-
Datei- und Logverwaltungssperren
Diese Sperren schützen verschiedene Dateien. Beispielsweise schützt eine interne Sperre die Kontrolldatei, sodass sie nur von einem Prozess gleichzeitig geändert werden kann. Eine weitere Sperre koordiniert die Verwendung und Archivierung der Online Redo Log-Dateien. Datendateien werden gesperrt, um sicherzustellen, dass mehrere Instanzen eine Datenbank im Shared-Modus mounten oder dass eine Instanz sie im Exclusive-Modus mountet. Da Datei- und Logsperren den Status von Dateien angeben, werden diese Sperren notwendigerweise lange gehalten.
-
Tablespace- und Undo-Segmentsperren
Diese Sperren schützen Tablespaces und Undo-Segmente. Beispiel: Alle Instanzen, die auf eine Datenbank zugreifen, müssen sich darauf einigen, ob ein Tablespace online oder offline ist. Undo-Segmente sind gesperrt, sodass nur eine Datenbankinstanz in ein Segment schreiben kann.
Siehe auch: "Data Dictionary-Cache"
Manuelle Datensperren - Überblick
Sie können die standardmäßigen Sperrmechanismen von Oracle AI Database manuell außer Kraft setzen.
Oracle AI Database führt Sperren automatisch durch, um den gleichzeitigen Datenzugriff, die Datenintegrität und die Lesekonsistenz auf Anweisungsebene sicherzustellen. Das Überschreiben der Standardsperre ist jedoch in folgenden Situationen nützlich:
-
Anwendungen erfordern Lesekonsistenz auf Transaktionsebene oder wiederholbare Lesevorgänge.
In diesem Fall müssen Abfragen konsistente Daten für die Dauer der Transaktion erzeugen, ohne Änderungen durch andere Transaktionen widerzuspiegeln. Sie können die Lesekonsistenz auf Transaktionsebene erreichen, indem Sie explizite Sperren, schreibgeschützte Transaktionen, serialisierbare Transaktionen oder Standardsperren überschreiben.
-
Anwendungen erfordern, dass eine Transaktion exklusiven Zugriff auf eine Ressource hat, sodass die Transaktion nicht warten muss, bis andere Transaktionen abgeschlossen sind.
Sie können die automatische Sperre von Oracle AI Database auf Session- oder Transaktionsebene außer Kraft setzen. Auf Sessionebene kann eine Session die erforderliche Transaktionsisolationsebene mit der Anweisung ALTER SESSION festlegen. Auf Transaktionsebene setzen Transaktionen mit den folgenden SQL-Anweisungen die standardmäßige Sperre von Oracle AI Database außer Kraft:
-
Die Anweisung
SET TRANSACTION ISOLATION LEVEL -
Die Anweisung
LOCK TABLE(die entweder eine Tabelle oder, wenn sie mit Views verwendet wird, die Basistabellen sperrt) -
Die Anweisung
SELECT ... FOR UPDATE
Von den vorherigen Anweisungen erworbene Sperren werden freigegeben, nachdem die Transaktion beendet wurde oder ein Rollback, um Savepoint freizugeben.
Wenn die Oracle AI Database-Standardsperre auf einer beliebigen Ebene außer Kraft gesetzt wird, muss der Datenbankadministrator oder Anwendungsentwickler sicherstellen, dass die außer Kraft gesetzten Sperrverfahren ordnungsgemäß funktionieren. Die Sperrverfahren müssen folgende Kriterien erfüllen: Datenintegrität ist gewährleistet, Datennebenläufigkeit ist akzeptabel und Deadlocks sind nicht möglich oder werden angemessen behandelt.
Siehe:
-
Oracle AI Database SQL Language Reference für Beschreibungen von
LOCK TABLEundSELECT -
Oracle AI Database Development Guide enthält Informationen zum manuellen Sperren von Tabellen
Benutzerdefinierte Sperren - Überblick
Mit Oracle AI Database Lock Management-Services können Sie eigene Sperren für eine bestimmte Anwendung definieren.
Beispiel: Sie erstellen eine Sperre, um den Zugriff auf ein Meldungsprotokoll im Dateisystem zu serialisieren. Da eine reservierte Benutzersperre mit einer Oracle AI Database-Sperre identisch ist, verfügt sie über alle Oracle AI Database-Sperrfunktionen, einschließlich Deadlock-Erkennung. Benutzersperren stehen nie in Konflikt mit Oracle AI Database-Sperren, da sie mit dem Präfix UL identifiziert werden.
Die Oracle AI Database Lock Management-Services sind über Prozeduren im Package DBMS_LOCK verfügbar. Sie können Anweisungen in PL/SQL-Blöcke aufnehmen, die:
-
Sperren eines bestimmten Typs anfordern
-
Geben Sie einen eindeutigen Namen an, der in einer anderen Prozedur in derselben oder in einer anderen Instanz erkannt werden kann
-
Sperrtyp ändern
-
Sperrung aufheben
Siehe:
-
Oracle AI Database Development Guide für weitere Informationen zu Oracle AI Database Lock Management-Services
-
Oracle AI Database PL/SQL Packages and Types Reference für Informationen zu
DBMS_LOCK
Fußnotenlegende
Fußnote 1:
Bei der Verarbeitung eines verteilten Two-Phase Commits kann die Datenbank den Lesezugriff unter besonderen Umständen kurzzeitig verhindern. Wenn eine Abfrage zwischen der Vorbereitungs- und Commit-Phase beginnt und versucht, die Daten vor dem Commit zu lesen, kann die Datenbank eine Sperre von Zeilenebene auf Blockebene eskalieren, um die Lesekonsistenz zu gewährleisten.