PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Blokada wiersza bazy danych podczas wielu transakcji

Twoje rozwiązanie z flagą wydaje się wykonalne i myślę, że jedyne, co jest potrzebne, to wygaśnięcie blokady. Zasadniczo sposób, w jaki zaprojektowałem zamek, to napisanie znacznika czasu, kiedy blokada została zabrana, i sprawię, że proces będzie musiał aktualizować blokada co jakiś czas (tj. co 30 sekund), podczas gdy nadal działa na nagraniu. Jeśli proces umrze lub w inny sposób nie zakończy pracy, blokada wygaśnie, a inne procesy mogą odblokować jeśli upłynie więcej niż dwukrotność limitu czasu.

Kiedy proces zakończy pracę nad rekordem, wyczyści flagę blokady i oznaczy rekord jako przetworzony (ponownie inną flagę).

Prawdopodobnie będziesz chciał mieć dwa pola:jedno, które przechowuje flagę blokady sygnatury czasowej, a drugie, które wskazuje, który proces jest właścicielem blokady (jeśli Ci na tym zależy). Zakładam, że istnieje pewien rodzaj klucza, którego można użyć do uporządkowania rekordów w tabeli, tak aby pojęcie „następnego działania” miało sens.

Możesz użyć takiego zapytania, aby uzyskać następny rekord do przetworzenia:

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

Przykładowe skrzypce tutaj: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. Klauzula ORDER BY ... USING w PostgreSQL

  2. Grupuj powiązane rekordy, ale wybierz określone pola tylko z pierwszego rekordu

  3. Jak uruchomić plik SQL w PostgreSQL za pomocą terminala Linux?

  4. Klucze obce + dziedziczenie tabel w PostgreSQL?

  5. Jaki jest najbardziej elegancki sposób przechowywania znacznika czasu za pomocą nanosec w postgresql?