PK é a chave primária? Então isso não é um problema, se você já conhece a chave primária, não há esporte. Se pk é a chave primária, então isso levanta a questão óbvia como você sabe o pk do item para desenfileirar...
O problema é se você não conhece a chave primária e deseja desenfileirar o próximo 'disponível' (ou seja, status =y) e marcá-lo como desenfileirado (exclua-o ou defina status =z).
A maneira correta de fazer isso é usar uma única instrução. Infelizmente, a sintaxe difere entre Oracle e SQL Server. A sintaxe do SQL Server é:
update top (1) [<table>]
set status = z
output DELETED.*
where status = y;
Não estou familiarizado o suficiente com a cláusula RETURNING do Oracle para dar um exemplo semelhante ao OUTPUT do SQL.
Outras soluções do SQL Server exigem que as dicas de bloqueio no SELECT (com UPDLOCK) estejam corretas. .
De qualquer forma, o comportamento que você tem na postagem original está incorreto. Várias sessões podem selecionar a(s) mesma(s) linha(s) e até mesmo todas atualizá-la, retornando o(s) mesmo(s) item(ns) retirado(s) da fila para vários leitores.