sql >> Base de Datos >  >> RDS >> Oracle

comparación atómica e intercambio en una base de datos

¿Es PK la clave principal? Entonces esto no es un problema, si ya conoce la clave principal, no hay problema. Si pk es la clave principal, entonces esto plantea la pregunta obvia cómo ¿sabes el pk del artículo para sacar de la cola...

El problema es si no conoce la clave principal y desea sacar de la cola el siguiente 'disponible' (es decir, estado =y) y marcarlo como fuera de la cola (eliminarlo o establecer estado =z).

La forma correcta de hacer esto es usar una sola declaración. Desafortunadamente, la sintaxis difiere entre Oracle y SQL Server. La sintaxis de SQL Server es:

update top (1) [<table>]
set status = z 
output DELETED.*
where  status = y;

No estoy lo suficientemente familiarizado con la cláusula RETURNING de Oracle para dar un ejemplo similar al de OUTPUT de SQL.

Otras soluciones de SQL Server requieren que las sugerencias de bloqueo en SELECT (con UPDLOCK) sean correctas. En Oracle, la vía preferida es usar FOR UPDATE, pero eso no funciona en SQL Server ya que FOR UPDATE se debe usar junto con los cursores en SQL .

En cualquier caso, el comportamiento que tienes en el post original es incorrecto. Múltiples sesiones pueden seleccionar la(s) misma(s) fila(s) e incluso actualizarla, devolviendo los mismos elementos retirados de la cola a múltiples lectores.