Autor Zpráva
Musilda
Profil
Dobrý den,

mám otázku na to, jak postupovat, pokud chci určitou akci provést pouze jednou.

Problém:

Na určité url přijmu notifikaci z externí služby, na základě které volám statickou metodu třídy, která odešle na jinou url druhé externí služby určitá data.
Problém nastává v tu chvíli, kdy ta první služba je schopna zavolat tu url dvakrát za sebou a protože proces odeslání dat na druhou službu ještě není u konce a není v databázi uložena informace, že již došlo k odeslání, odešlou se data podruhé.

Otázka:

Je možné upravit třídu tak, aby se nedal vytvořit souběžný požadavek? Budou mi stačit i odkazy na nějaké články, jen jsem nevěděl, jak se na to Google zeptat.
juriad
Profil
Musilda:
Ulož si do databáze, že se požadavek vyřizuje a případně i datum a čas.

Před prvním požadavkem:
je db prázdná

Po přijetí prvního požadavku:
přidat záznam: ID, SENDING, 2018-10-11 8:41:00.105

Po přijetí druhého požadavku:
vyhledat ID v db (a zamítnout)

Po vyhodnocení prvního požadavku:
změnit záznam na: ID, PROCESSED, 2018-10-11 8:41:00.367

Ten čas si tam ukládáš proto, že kydby čas < now() - 10 minutes, tak chceš požadavek zopakovat (například).

Alternativou by bylo před odesláním: LOCK TABLE tabulka WRITE, pak zapsat výsledek zpracování a následně: UNLOCK TABLES.
Databáze se postará, že jen jeden klient/požadavek může držet zámek k tabulce. Nevýhodou je, že neumožníš zpracování více různých požadavků zároveň.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0