Oracle SQL: Zeilensperre bei Select-Anweisung

Das Ziel dieses Beitrags ist es zu erklären, wie ein Datensatz in einer Oracle-Datenbank mithilfe einer Select-Anweisung gesperrt wird.

Einführung

Das Ziel dieses Beitrags ist es zu erklären, wie man einen Datensatz in einer Oracle-Datenbank mit einer select-Anweisung sperrt. Auf diese Weise können wir einen Datensatz sperren, ohne ihn ändern zu müssen.

Obwohl dies kein sehr häufiger Anwendungsfall zu sein scheint, ist die Wahrheit, dass wir es möglicherweise für komplexere Programme benötigen (z. B. in PL / SQL implementiert), bei denen wir einige komplexe Validierungen durchführen müssen, bevor wir uns entscheiden, ein bestimmtes Register zu aktualisieren, und wir müssen es während dieser Validierungen gesperrt halten, damit keine andere Transaktion es gleichzeitig ändern kann.

Wir werden SQL Developer verwenden, um mit der Datenbank zu interagieren und die Abfragen für dieses Lernprogramm auszuführen.

Sperren desselben Datensatzes

Wie üblich erstellen wir zunächst eine einfache Dummy-Tabelle, um unsere Daten zu speichern. Überprüfen Sie das create-Beispiel unten.

create table Worker(WorkerID varchar(20),WorkerName varchar(255),WorkerJob varchar(255),CONSTRAINT PK_Worker PRIMARY KEY (WorkerID));

Danach werden wir einige Dummy-Datensätze einfügen, damit wir Daten bearbeiten können. Wir werden drei Datensätze einfügen und dann die Transaktion festschreiben. Sie können die Commit-Schaltfläche im SQL Developer-Menü verwenden oder die Transaktion explizit mit einer SQL-Anweisung festschreiben.

insert into worker values ('1','John', 'nurse');insert into worker values ('2','Grace', 'farmer');insert into worker values ('3','Smith', 'doctor');

Jetzt öffnen wir ein neues nicht freigegebenes Arbeitsblatt, damit wir die SQL-Anweisungen in unabhängigen Transaktionen testen können. Überprüfen Sie Abbildung 1, wie es geht. Weitere Informationen zu nicht freigegebenen SQL Developer-Arbeitsblättern finden Sie in diesem vorherigen Beitrag.

SQL Developer nicht freigegebenes Arbeitsblatt

Abbildung 1 – Öffnen eines neuen nicht freigegebenen Arbeitsblatts.

Als erstes führen wir in beiden Arbeitsblättern eine reguläre Auswahl aus. Wir werden eine Auswahl treffen, um den Datensatz zu erhalten, bei dem die WorkerID gleich 1 ist. Führen Sie keine Commits oder Rollbacks durch, sondern führen Sie einfach dieselbe Abfrage in beiden Arbeitsblättern aus.

select * from worker where WorkerID = 1;

Wie erwartet gibt es kein Problem mit der Parallelität und wir erhalten den Datensatz in beiden Transaktionen (wobei der WorkerName gleich „John“ ist).

Nun kehren wir zum ersten Arbeitsblatt zurück (dem gleichen, in dem wir die Tabelle erstellt haben) und fügen am Ende der select-Anweisung eine „for update“ -Klausel hinzu, wie unten angegeben. Führen Sie auch hier kein Commit oder Rollback durch.

select * from worker where WorkerID = 1 for update;

Wenn wir dies tun, sperren wir die Datensätze der Ergebnismenge, ohne sie aktualisieren zu müssen . Mit anderen Worten, wir sperren die Datensätze explizit. Sobald wir sie gesperrt haben, können wir sie natürlich aktualisieren, wenn wir möchten. Die Sperren für die Datensätze werden beim nächsten Commit oder Rollback freigegeben .

Um zu testen, ob die Sperren funktionieren, gehen wir jetzt zum zweiten Arbeitsblatt (dem nicht freigegebenen Arbeitsblatt, das wir geöffnet haben). Wenn wir dort eine reguläre Auswahl ohne den „for update sentence“ durchführen, erhalten wir den Datensatz ohne Probleme.

select * from worker where WorkerID = 1;

Aber wenn wir die Auswahl wiederholen, jetzt mit dem Satz „for update“ am Ende, hängt sie, da bei einer anderen Transaktion der Datensatz mit der WorkerID gleich 1 gesperrt ist und wir versuchen, ihn erneut zu sperren.

select * from worker where WorkerID = 1 for update;

Um es zu entsperren, kehren Sie einfach zum ersten Arbeitsblatt zurück und führen Sie die Transaktion fest oder setzen Sie sie zurück. Kehren Sie nun zum nicht freigegebenen Arbeitsblatt zurück, und die SQL-Anweisung sollte ausgeführt werden, wobei der gewünschte Datensatz zurückgegeben wird.

Sperren verschiedener Datensätze

Es ist wichtig zu beachten, dass nur die Datensätze, die Teil der Ergebnismenge sind, von der Transaktion gesperrt werden. So können verschiedene Transaktionen in verschiedenen Datensätzen „Zur Aktualisierung auswählen“.

Um dies zu testen, gehen Sie zum ersten Arbeitsblatt und wählen Sie Datensatz 1 und 3 mit dem folgenden Select-Satz aus:

select * from worker where WorkerID = 1 or WorkerID = 3 for update;

Gehen Sie nun zum nicht freigegebenen Arbeitsblatt und versuchen Sie, Datensatz 2 zu sperren.

select * from worker where WorkerID = 2 for update;

Es sollte funktionieren und ein Ergebnis zurückgeben, da der Datensatz mit WorkerID gleich 2 durch die erste Transaktion nicht gesperrt wurde. Wenn wir nun im selben nicht freigegebenen Arbeitsblatt versuchen, den Datensatz mit der Worker-ID gleich 1 oder den Datensatz mit der Worker-ID gleich 3 (oder beiden) zu sperren, bleibt er hängen, bis wir die Transaktion vom ersten Arbeitsblatt aus festschreiben oder zurücksetzen.

Zugehöriger Inhalt

  • Oracle Select für Update-Anweisung

Write a Comment

Deine E-Mail-Adresse wird nicht veröffentlicht.