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