Cómo seleccionar un registro de la base de datos y actualizarlo en una consulta atómica

Resuelto lahsrah asked hace 13 años • 4 respuestas

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.

lahsrah avatar Apr 20 '11 13:04 lahsrah
Aceptado

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.

Dalex avatar Apr 20 '2011 06:04 Dalex

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
Mikael Eriksson avatar Apr 20 '2011 06:04 Mikael Eriksson

Esto debería funcionar

UPDATE [table]
SET Status = 'InProcess'
WHERE Status = 'Pending'

SQL 2008 debería encargarse de cualquier bloqueo por usted.

tobias86 avatar Apr 20 '2011 06:04 tobias86