PK първичен ключ ли е? Тогава това не е проблем, ако вече знаете първичния ключ, няма спорт. Ако pk е първичния ключ, тогава това повдига очевидния въпрос как знаете ли pk на елемента за изваждане от опашката...
Проблемът е, ако не знаете първичния ключ и искате да извадите от опашката следващия „наличен“ (т.е. статус =y) и да го маркирате като изваден от опашката (изтрийте го или задайте статус =z).
Правилният начин да направите това е да използвате един израз. За съжаление синтаксисът се различава между Oracle и SQL Server. Синтаксисът на SQL Server е:
update top (1) [<table>]
set status = z
output DELETED.*
where status = y;
Не съм достатъчно запознат с клаузата RETURNING на Oracle, за да дам пример, подобен на OUTPUT на SQL.
Други решения на SQL Server изискват подсказки за заключване на SELECT (с UPDLOCK), за да бъдат правилни. В Oracle предпочитаният път е използването на FOR UPDATE, но това не работи в SQL Server, тъй като FOR UPDATE трябва да се използва във връзка с курсори в SQL .
Във всеки случай поведението, което имате в оригиналния пост, е неправилно. Няколко сесии могат да избират един и същи ред(ове) и дори всички да го актуализират, връщайки един и същ елемент(и) от опашката на множество читатели.