Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Les procédures stockées verrouillent-elles les tables/lignes ?

Vous pourriez obtenir une condition de concurrence.

Cela peut être fait en une seule déclaration :

  • Vous pouvez attribuer dans une MISE À JOUR
  • Les indications de verrouillage permettent à un autre processus de sauter cette ligne
  • La clause OUTPUT renvoie des données à l'appelant

Essayez ceci... (edit :holdlock supprimé)

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

Sinon, vous aurez peut-être besoin d'une sélection séparée

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

Voir ceci s'il vous plaît pour plus :SQL Server Process Queue Race Condition