sql >> Base de Datos >  >> RDS >> Sqlserver

¿Los procedimientos almacenados bloquean tablas/filas?

Podría obtener una condición de carrera.

Se puede hacer en una declaración:

  • Puedes asignar en una ACTUALIZACIÓN
  • Las sugerencias de bloqueo permiten que otro proceso omita esta fila
  • La cláusula OUTPUT devuelve datos a la persona que llama

Prueba esto... (editar:holdlock eliminado)

Update TOP (1) ServerLoginUsers WITH (ROWLOCK, READPAST)
OUTPUT INSERTED.*
SET
   AssignedTo = @User, AssignedToDate = getdate(), SourcePool = @UserPool
WHERE
   AssignedTo is null and [TsServer] = @Server   -- not needed -> and UserName = @ServerUser

De lo contrario, es posible que necesite una selección separada

Update TOP (1) ServerLoginUsers WITH (ROWLOCK, READPAST)
SET
    -- yes, assign in an update
   @ServerUser = UserName,
   -- write
   AssignedTo = @User, AssignedToDate = getdate(), SourcePool = @UserPool
OUTPUT INSERTED.*
WHERE
   AssignedTo is null and [TsServer] = @Server   -- not needed -> and UserName = @ServerUser

SELECT ...

Consulte esto para obtener más información:SQL Server Process Queue Race Condition