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

atomarer Vergleich und Austausch in einer Datenbank

Ist PK der Primärschlüssel? Dann ist dies kein Problem, wenn Sie den Primärschlüssel bereits kennen, gibt es keinen Sport. Wenn pk ist den Primärschlüssel, dann stellt sich die offensichtliche Frage wie Kennen Sie die pk des Elements, das aus der Warteschlange entfernt werden soll...

Das Problem ist, wenn Sie nicht den Primärschlüssel kennen und den nächsten 'verfügbaren' (dh Status =y) aus der Warteschlange entfernen und ihn als aus der Warteschlange entfernen markieren möchten (löschen oder Status =z setzen).

Der richtige Weg, dies zu tun, ist die Verwendung einer einzelnen Anweisung. Leider unterscheidet sich die Syntax zwischen Oracle und SQL Server. Die SQL Server-Syntax lautet:

update top (1) [<table>]
set status = z 
output DELETED.*
where  status = y;

Ich bin mit der RETURNING-Klausel von Oracle nicht vertraut genug, um ein Beispiel zu geben, das der OUTPUT-Klausel von SQL ähnelt.

Andere SQL Server-Lösungen erfordern korrekte Sperrhinweise für SELECT (mit UPDLOCK). In Oracle ist die Verwendung von FOR UPDATE der bevorzugte Weg, aber das funktioniert nicht in SQL Server, da FOR UPDATE in Verbindung mit Cursorn in SQL verwendet werden soll .

In jedem Fall ist das Verhalten, das Sie im ursprünglichen Beitrag haben, falsch. Mehrere Sitzungen können alle dieselbe(n) Zeile(n) auswählen und sie sogar alle aktualisieren, wodurch dieselben aus der Warteschlange entfernten Elemente an mehrere Leser zurückgegeben werden.