Cómo seleccionar un registro de la base de datos y actualizarlo en una consulta atómica
Tengo varios registros en una tabla con una columna Estado y quiero seleccionar un solo registro donde Estado = Pendiente y en la misma consulta atómica marcarlo como Estado = En proceso. ¿Cuál es la mejor manera de hacer eso?
Esto es necesario porque se pueden ejecutar varias consultas al mismo tiempo intentando procesar estos registros y no quiero que dos subprocesos recojan el mismo registro para procesar.
Puede utilizar la cláusula OUTPUT:
UPDATE [table]
SET Status = 'InProcess'
OUTPUT deleted.*
WHERE Status = 'Pending'
Aquí puede usar el nombre de la tabla insertada si desea obtener una fila con un estado nuevo o eliminarla cuando sea antigua.
Aquí hay un artículo sobre el uso de tablas como colas .
Con esta tabla create table T (ID int identity, Status varchar(15))
Algo como esto debería mantenerte a salvo de puntos muertos.
;with cte as
(
select top 1 *
from T with (rowlock, readpast)
where Status = 'Pending'
order by ID
)
update cte
set Status = 'InProcess'
output inserted.ID, inserted.Status
Esto debería funcionar
UPDATE [table]
SET Status = 'InProcess'
WHERE Status = 'Pending'
SQL 2008 debería encargarse de cualquier bloqueo por usted.