Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Sperren gespeicherte Prozeduren Tabellen/Zeilen?

Sie könnten eine Race-Condition bekommen.

Dies kann in einer Anweisung erfolgen:

  • Sie können in einem UPDATE zuweisen
  • Die Sperrhinweise erlauben es einem anderen Prozess, zu überspringen diese Zeile
  • Die OUTPUT-Klausel gibt Daten an den Aufrufer zurück

Versuchen Sie Folgendes ... (Bearbeiten:Holdlock entfernt)

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

Wenn nicht, benötigen Sie möglicherweise eine separate Auswahl

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 ...

Weitere Informationen finden Sie hier:SQL Server Process Queue Race Condition