sql >> Databasteknik >  >> RDS >> PostgreSQL

Databasradlås under flera transaktioner

Din lösning med flaggan verkar genomförbar och jag tror att det enda som behövs är att få låset att förfalla. I grund och botten skulle jag utforma låset på att jag skulle skriva en tidsstämpel när låset togs och göra det så att processen måste uppdateras låset då och då (dvs var 30:e sekund) medan det fortfarande jobbar på skivan. Om processen dör eller på annat sätt misslyckas med att slutföra arbetet kommer låset att upphöra och andra processer kan låsa upp det om mer än dubbla timeoutperioden går.

När en process avslutar arbetet med en post skulle den rensa låsflaggan och markera posten som bearbetad (igen en annan flagga).

Du kommer förmodligen att vilja ha två fält:ett som skulle lagra tidsstämpellåsflaggan och ett annat som skulle indikera vilken process som äger låset (ifall du bryr dig om det). Jag antar att det finns någon slags nyckel som kan användas för att ordna posterna i tabellen så att begreppet "nästa åtgärd" är meningsfullt.

Du kan använda en fråga som denna för att få nästa post att bearbeta:

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

Exempel på fiol här:http://sqlfiddle.com/#!11/9c120/26 /1




  1. MySQL - GROUP_CONCAT med joins

  2. Hur gör man en vilsam lösenordspåminnelse och ändrar användarens e-postfält till användarnamnsfält med Laravel 5.0?

  3. PLS-00103:Påträffade symbolen CREATE

  4. Hur man ansluter till mysql-databas i phonegap