PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Заключване на ред в базата данни по време на множество транзакции

Вашето решение с флага изглежда осъществимо и мисля, че единственото нещо, което е необходимо, е заключването да изтече. По принцип начинът, по който бих проектирал ключалката, е, че ще напиша клеймо за време, когато заключването е взето, и ще го направя така, че процесът да трябва да актуализира ключалката толкова често (т.е. на всеки 30 секунди), докато все още работи върху записа. Ако процесът умре или по друг начин не успее да завърши работата, заключването ще изтече и други процеси могат да отключат ако изтече повече от два пъти периода на изчакване.

Когато даден процес приключи работата по запис, той ще изчисти флага за заключване и ще маркира записа като обработен (отново друг флаг).

Вероятно ще искате да имате две полета:едно, което да съхранява флага за заключване на времевия печат и друго, което да показва кой процес притежава заключването (в случай, че ви е грижа за това). Предполагам, че има някакъв вид ключ, който може да се използва за подреждане на записите в таблицата, така че понятието "следващо действие" да има смисъл.

Можете да използвате заявка като тази, за да получите следващия запис за обработка:

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

Примерен Fiddle тук:http://sqlfiddle.com/#!11/9c120/26 /1




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изберете записи от последните 24 часа в PostgreSQL

  2. Как да предотвратим изтриването на първия ред в таблицата (PostgreSQL)?

  3. SQLAlchemy create_all() не създава таблици

  4. PostgreSQL изпълнява ли някои оптимизации на производителността за транзакции само за четене

  5. PostgreSQL - получаване на материализирани метаданни за колона за изглед