Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Le stored procedure bloccano tabelle/righe?

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