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

Zeilensperren - manuell verwenden

Die Art von Ansatz, die ich empfehlen würde, besteht darin, ein Feld im Datensatz zu haben, das angibt, ob der Datensatz verarbeitet wird oder nicht. Implementieren Sie dann einen "Lesen Sie den nächsten aus der Warteschlange"-Sproc, der Folgendes tut, um sicherzustellen, dass keine 2 Prozesse denselben Datensatz aufnehmen:

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

Weitere Informationen zu diesen Tabellenhinweisen finden Sie unter MSDN