Oracle
 sql >> Database >  >> RDS >> Oracle

confronto atomico e scambio in un database

PK è la chiave primaria? Quindi questo non è un problema, se conosci già la chiave primaria non c'è sport. Se pk è la chiave primaria, quindi questo pone l'ovvia domanda come conosci il pk dell'articolo da togliere dalla coda...

Il problema è se non conosci la chiave primaria e desideri rimuovere dalla coda la prossima "disponibile" (es. status =y) e contrassegnarla come rimossa (eliminala o imposta status =z).

Il modo corretto per farlo è utilizzare una singola istruzione. Sfortunatamente la sintassi è diversa tra Oracle e SQL Server. La sintassi di SQL Server è:

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

Non ho abbastanza familiarità con la clausola RETURNING di Oracle per fornire un esempio simile a quello di OUTPUT di SQL.

Altre soluzioni di SQL Server richiedono che i suggerimenti di blocco su SELECT (con UPDLOCK) siano corretti. In Oracle la via preferita è utilizzare FOR UPDATE, ma non funziona in SQL Server poiché FOR UPDATE deve essere utilizzato insieme ai cursori in SQL .

In ogni caso, il comportamento che hai nel post originale non è corretto. Più sessioni possono selezionare tutte le stesse righe e persino aggiornarle, restituendo gli stessi elementi rimossi dalla coda a più lettori.