Potresti avere una condizione di gara.
Può essere fatto in un'unica affermazione:
- Puoi assegnare in un AGGIORNAMENTO
- I suggerimenti per il blocco consentono a un altro processo di saltare questa riga
- La clausola OUTPUT restituisce i dati al chiamante
Prova questo... (modifica:blocco rimosso)
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
In caso contrario, potresti aver bisogno di una selezione separata
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 ...
Per ulteriori informazioni, vedere questo:Condizione di competizione della coda di processo di SQL Server