sql >> Databáze >  >> RDS >> PostgreSQL

Zámek řádku databáze během více transakcí

Vaše řešení s příznakem se zdá být proveditelné a myslím, že jediná věc, kterou je potřeba, je nechat vypršet platnost zámku. V zásadě bych zámek navrhl tak, že bych napsal časové razítko, kdy byl zámek pořízen, a udělal ho tak, aby se proces musel aktualizovat zámek se tak často (tj. každých 30 sekund), zatímco stále pracuje na záznamu. Pokud proces zemře nebo z jiného důvodu nedokončí práci, platnost zámku vyprší a ostatní procesy se mohou odemknout pokud uplyne více než dvojnásobek časového limitu.

Když proces dokončí práci na záznamu, vymaže příznak zámku a označí záznam jako zpracovaný (opět další příznak).

Pravděpodobně budete chtít mít dvě pole:jedno, které by ukládalo příznak zámku časového razítka a druhé, které by indikovalo, který proces vlastní zámek (v případě, že vás to zajímá). Předpokládám, že existuje nějaký druh klíče, který lze použít k uspořádání záznamů v tabulce tak, aby koncept "další akce" měl smysl.

Dotaz, jako je tento, můžete použít k získání dalšího záznamu ke zpracování:

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

Ukázka houslí zde:http://sqlfiddle.com/#!11/9c120/26 /1




  1. MySQL:Vložení do více tabulek ve stejném dotazu pomocí BEGIN&COMMIT

  2. C# DateTime se mění na jiný formát

  3. PDO bindParam() s více pojmenovanými parametry

  4. postgresql - přidat booleovský sloupec do výchozí sady tabulky