sql >> Database >  >> RDS >> Sqlserver

Rijsloten - handmatig gebruiken

Het soort aanpak dat ik zou aanraden is om een ​​veld in het record te hebben in de trant van dat aangeeft of het record wordt verwerkt of niet. Implementeer vervolgens een "lees volgende uit de wachtrij"-sproc die het volgende doet, om ervoor te zorgen dat geen twee processen hetzelfde record oppikken:

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

Zie MSDN voor meer informatie over deze tabelhints.



  1. Ik probeer psycopg2 te installeren op Mac OS 10.6.3; het beweert dat het stdarg.h niet kan vinden, maar ik kan zien dat het er is; wat moet ik doen?

  2. Is het mogelijk om een ​​kolom te maken met een UNIX_TIMESTAMP standaard in MySQL?

  3. TEKST versus VARCHAR in InnoDB MySQL 5.5. Wanneer gebruik je ze allemaal?

  4. LEAST() Functie in Oracle