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.