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