sql >> Database >  >> RDS >> Oracle

atomaire vergelijking en swap in een database

Is PK de primaire sleutel? Dan is dit geen probleem, als je de primaire sleutel al kent is er geen sport. Als pk is de primaire sleutel, dan roept dit de voor de hand liggende vraag op hoe weet je de pk van het item dat uit de wachtrij moet worden gehaald...

Het probleem is als je niet ken de primaire sleutel en wil de volgende 'beschikbare' (dwz status =y) uit de wachtrij halen en markeren als uit de wachtrij verwijderd (verwijder het of stel status =z in).

De juiste manier om dit te doen is door een enkele verklaring te gebruiken. Helaas verschilt de syntaxis tussen Oracle en SQL Server. De syntaxis van SQL Server is:

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

Ik ben niet bekend genoeg met de RETURNING-clausule van Oracle om een ​​voorbeeld te geven dat lijkt op dat van SQL OUTPUT.

Andere SQL Server-oplossingen vereisen vergrendelingshints op de SELECT (met UPDLOCK) om correct te zijn. In Oracle is de voorkeursroute om FOR UPDATE te gebruiken, maar dat werkt niet in SQL Server, aangezien FOR UPDATE moet worden gebruikt in combinatie met cursors in SQL .

In ieder geval is het gedrag dat je in de originele post hebt onjuist. Meerdere sessies kunnen allemaal dezelfde rij(en) selecteren en zelfs allemaal bijwerken, waarbij hetzelfde uit de wachtrij verwijderde item(s) naar meerdere lezers wordt teruggestuurd.



  1. Beperking van gegevensflexibiliteit in een NoSQL-database

  2. exclusieve mySQL-records

  3. MySql Bulk-invoeging

  4. Applicatiecode herontwerp om nee te verminderen. van databasehits vanuit prestatieperspectief