sql >> Databasteknik >  >> RDS >> Sqlserver

Låser lagrade procedurer tabeller/rader?

Du kan få en tävlingskondition.

Det kan göras i ett uttalande:

  • Du kan tilldela i en UPPDATERING
  • Låstipsen tillåter en annan process att hoppa över den här raden
  • OUTPUT-satsen returnerar data till den som ringer

Prova detta... (redigera:låset har tagits bort)

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

Om inte kan du behöva ett separat val

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

Se detta för mer:SQL Server Process Queue Race Condition




  1. Använder parameter som kolumnnamn i Postgres-funktionen

  2. Lägg till ett databaspostkonto till en profil (T-SQL)

  3. Oracle:hur är situationen att använda RAISE_APPLICATION_ERROR?

  4. Hur man uppdaterar Array i PostgreSQL