Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

comparação atômica e troca em um banco de dados


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.