MySQL: read once

Re:MySQL: read once
« Odpověď #15 kdy: 02. 05. 2025, 13:01:01 »
MalyTomi: To je to, co má OP aktuálně. Problém je v tom, že má více producentů a do DB mohou být vloženy starší záznamy až po tom, co tam jsou už nějaké novější.
Nejako tomu nerozumiem, ten datum a cas by sa generoval az v okamziku commitu, ako default hodnota. Takze aj keby tam niekto vkladal starsie zaznamy, tak ten datum a cas by bol aktualny. A ak by aktualizator bezal pocas transakcie, tak by aj tak tie necommitnute zaznamy nevidel a teda by mal ulozeny starsi cas.


Re:MySQL: read once
« Odpověď #16 kdy: 03. 05. 2025, 01:31:02 »
Já teda nevím, co umí a neumí MySQL, PostgreSQL umí serializované transakce, takže tohle je vyřešeno buď přímo standardní transakční izolací (a opravdu to bezpečně funguje) nebo ještě druhá varianta, která v některých případech je přímo vhodná pro stavbu atomické fronty a to je SELECT FOR UPDATE SKIP LOCKED.

https://www.postgresql.org/docs/17/sql-select.html#SQL-FOR-UPDATE-SHARE

Funguje to tak, že příkaz SELECT FOR UPDATE automaticky dá zámek pouze na ty řádky, které vyhovují WHERE. Takže SKIP LOCKED tyto řádky automaticky přeskočí.

Já si takto implementoval atomickou frontu, kde nebylo nutné udržet pořadí (ale stále jde mít ORDER BY) a každý řádek bylo nutné zpracovat pouze jednou a skutečně jednou a mít o tom záznam.

Takže něco jako WHERE todo=True, a v UPDATE potom ve transakci zapsat data a nastavit na SET todo=False + v mém případě ještě SET when=now() což je čas počátku transakce. Takže pochopitelně si pohlídat fci, jestli je to čas transakce nebo počátku session. Já to měl vlastně stejné, každý klient se připojil, zpracoval jeden záznam (až minuty nebo desítky minut), nebylo možné blokovat ostatní klienty (miliony položek v todo), takže jsem to vyřešit takto a doma v home labu jsem takto pustil jednoho klienta per CPU Thread, takže na síti cca 128 workerů a každý jeden řešil jeden obrázek (v mém případě, render z POVRay, převod na png správných rozměrů a ořezů a nakonec vytvoření animace a export jako video). Na data má Postgresql datový typ BYTEA do 1GB, což se vešlo.

Takže ověřit si, jestli MySQL umí serializable, jestli umí atomický set a where (ano umí, ale je potřeba si to vyžádat správnou izolací) a lze to mít i bez transakční izolace serializable, která toho uzamyká no vlastně všechno.

Tomáš Vondra o tom napsal pěkný článek na 2quadrant, ale nemůžu to najít.

Sam

Re:MySQL: read once
« Odpověď #17 kdy: 03. 05. 2025, 11:06:22 »
V podstate jak zminil nekdo prede mnou potrebujes frontu. Napriklad Oracle ma implementaci oracle advanced queuing jiz skoro pres 20let ( pouzivame to v nasem reseni ). Hledej DBMS_AQ a DBMS_AQ_ADM ( pisu z hlavy ) pro inspiraci. Nevim jestli nekdo pro mysql neudelal nejaky podobny plugin. Samozrejme si muzes naprogramovat neco podobneho ( for update & skip locekd & nowait & limit ) ovsem transakce nebude read only.
https://dba.stackexchange.com/questions/98311/best-way-to-implement-concurrent-table-based-queue


Re:MySQL: read once
« Odpověď #18 kdy: 03. 05. 2025, 12:12:38 »
Tahle další diskuse potom, co si tazatel našel vohejbák a vyřešil problém se svým rovnákem, který není fronta, je úplně zbytečná.

A ano, pokud by v podobné situaci někdo dělal frontu (což většinou dává smysl protože se to pak dá případně škálovat na víc workerů, stav těch úloh je persistentně na jednom místě, nemusí se řešit nějaké lastID ve workeru, pokud se to z jakéhokoliv důvodu restartuje, spadne atd.), tak MySQL 8 (od 2017) resp. Maria (od 2021) má mimo zámků na řádky také SKIP LOCKED, jak jsem psal. Tzn. jde to udělat podobně jako třeba v Postgresu, nejsou potřeba další workaroundy. Ale jak už tazatel zmínil, je to off-topic.

hknmtt

  • ****
  • 307
    • Zobrazit profil
    • E-mail
Re:MySQL: read once
« Odpověď #19 kdy: 05. 05. 2025, 16:58:49 »
Ak by niekoho tato problematika zaujimala(teda to co bolo v povodnej otazke a nie ta typicka rootovska off topic diskusia o frontach a podobne), tak tu mozete najst nejake informacie https://mattjames.dev/auto-increment-ids-are-not-strictly-monotonic/