sql >> Database >  >> RDS >> PostgreSQL

Databaserijvergrendeling tijdens meerdere transacties

Uw oplossing met de vlag lijkt haalbaar en ik denk dat het enige dat nodig is, is om het slot te laten verlopen. De manier waarop ik het slot zou ontwerpen, is dat ik een tijdstempel zou schrijven wanneer het slot werd genomen en het zo zou maken dat het proces zou moeten bijwerken het slot om de zoveel tijd (d.w.z. elke 30 seconden) terwijl het nog steeds aan de plaat werkt. Als het proces sterft of anderszins het werk niet voltooit, vervalt de vergrendeling en kunnen andere processen ontgrendelen het als meer dan het dubbele van de time-outperiode verstrijkt.

Wanneer een proces klaar is met werken aan een record, zou het de vergrendelingsvlag wissen en het record markeren als verwerkt (opnieuw een andere vlag).

U zult waarschijnlijk twee velden willen hebben:een waarin de vergrendelingsvlag van het tijdstempel wordt opgeslagen en een andere die aangeeft welk proces eigenaar is van de vergrendeling (voor het geval u er om geeft). Ik neem aan dat er een soort sleutel is die kan worden gebruikt om de records in de tabel zodanig te ordenen dat het concept van "volgende actie" zinvol is.

U kunt een query als deze gebruiken om het volgende record te verkrijgen dat moet worden verwerkt:

 -- find the next available process and "lock" it by updating it's flag
 UPDATE actions_tabe
    SET LockFlag = @timestamp,
        Process = @processname
  WHERE Id IN (SELECT Id
            FROM actions_table
           WHERE LockFlag IS null
             AND IsComplete = '0'
             AND ScheduledTime < now()
           ORDER BY Scheduledtime ASC, Id ASC
           LIMIT 1);

 -- return the Id and Action of the record that was just marked above
 SELECT Id, Action
   FROM actions_table
  WHERE Process = @processname

Sample Fiddle hier:http://sqlfiddle.com/#!11/9c120/26 /1




  1. Aftrekken tussen twee sql-query's

  2. Controleer een hele tabel op een enkele waarde

  3. Hoe u Execute Immediate met INTO-clausule in Oracle Database gebruikt?

  4. Een afbeelding opslaan in MySQL vanuit Java