Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Os procedimentos armazenados bloqueiam tabelas/linhas?


Você pode obter uma condição de corrida.

Isso pode ser feito em uma declaração:
  • Você pode atribuir em um UPDATE
  • As dicas de bloqueio permitem que outro processo pule esta linha
  • A cláusula OUTPUT retorna dados ao chamador

Tente isso... (editar:holdlock removido)
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

Caso contrário, você pode precisar de uma seleção 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 ...

Veja isto para mais informações:Condição de corrida da fila de processo do SQL Server