PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Blocco delle righe del database durante più transazioni

La tua soluzione con il flag sembra fattibile e penso che l'unica cosa necessaria sia far scadere il blocco. Fondamentalmente il modo in cui architetterei il blocco è scrivere un timestamp quando il blocco è stato preso e farlo in modo che il processo debba aggiornare il blocco ogni tanto (cioè ogni 30 secondi) mentre sta ancora lavorando sul record. Se il processo si interrompe o altrimenti non riesce a completare il lavoro, il blocco scadrà e altri processi possono sbloccare se è trascorso più del doppio del periodo di timeout.

Quando un processo finisce di lavorare su un record, cancella il flag di blocco e contrassegna il record come elaborato (di nuovo un altro flag).

Probabilmente vorrai avere due campi:uno che memorizzerebbe il flag di blocco timestamp e un altro che indicherebbe quale processo possiede il blocco (nel caso ti interessi). Presumo che esista una sorta di chiave che può essere utilizzata per ordinare i record nella tabella in modo tale che il concetto di "azione successiva" sia significativo.

Puoi utilizzare una query come questa per ottenere il record successivo da elaborare:

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

Esempio di Fiddle qui:http://sqlfiddle.com/#!11/9c120/26 /1