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

Verrous de ligne - les utiliser manuellement

Le type d'approche que je recommanderais est d'avoir un champ dans l'enregistrement le long des lignes qui indique si l'enregistrement est en cours de traitement ou non. Ensuite, implémentez une sproc "lecture suivante à partir de la file d'attente" qui effectue les opérations suivantes, pour s'assurer qu'aucun processus 2 ne récupère le même enregistrement :

BEGIN TRANSACTION

-- Find the next available record that's not already being processed.
-- The combination of UPDLOCK and READPAST hints makes sure 2 processes don't 
-- grab the same record, and that processes don't block each other.
SELECT TOP 1 @ID = ID
FROM YourTable WITH (UPDLOCK, READPAST)
WHERE BeingProcessed = 0

-- If we've found a record, set it's status to "being processed"
IF (@ID IS NOT NULL)
    UPDATE YourTable SET BeingProcessed = 1 WHERE ID = @ID

COMMIT TRANSACTION

-- Finally return the record we've picked up
IF (@ID IS NOT NULL)
    SELECT * FROM YourTable WHERE ID = @ID

Pour plus d'informations sur ces conseils de table, consultez MSDN