Mam MySQL/MariaDB tabulku, ktora ma povedzme tri stlpce:
- prvy stlpec je integer, ktory je auto-increment
- druhy stlpec je unikatne a raditelne(sortovatelne) id odvodene od nejakej casovej znacky, ktore je vytvorene v aplikacii, takze je mozne chronologicky podla nej zoradit zaznamy
- treti stlpec su nejake data vo forme blobu
Potrebujem zabezpecit, ze kazdy riadok sa precita nejakym konzumentom iba jeden krat.
Problem: konzument ma read-only transakciu a precita si vsetky zaznamy, ked dobehne na koniec, ulozi si posledne id, nasledne opakuje proces s novou read-only transakciou, s tym ze pouzije posledne spracovane id ako podmienku pre vratenie novsich vysledkov. Ak nie su nove zaznamy, tak spi nejaky cas a proces znovu opakuje.
Teraz mam dve write transakcie, jedna zacne a vytvori nejake zaznamy. Druha write transakcia zacne po nej a tiez vytvori nejake zaznamy. Avsak druha transakcia skonci skor a commitne zmeny. Nasledne skonci prva transakcia a commitne zmeny.
Problem, ktory tu vznika je ten, ze prva transakcia bude mat mensi auto-increment integer(prvy stlpec), pripadne aj id ktore sa generuje v aplikacii(druhy stlpec), nez druha transakcia, takze chronologicky je to v poriadku. Lenze tym ze druha transakcia commitla skor, tak sa do DB zapisu riadky v "nespravnom" poradi. Co je bezne v poriadku, nic sa nedeje, mame stale unikatne idcka pre prvy aj druhy stlpec a indexy na radenie.
Lenze nas konzument ma teraz problem, ze preskocil zaznamy prvej transakcie, pretoze cital zaznamy, dobehol na koniec, spal, druha transakcia commitla zmeny, konzument spracoval nove zaznamy a ulozil si posledne id(ci uz auto-increment prveho stlpca, alebo aplikacne id z druheho stlpca), nasledne commitla prva transakcia, lenze mala mensie auto-increment id ako aj id z aplikacie, takze nas konzument tieto zaznamy nevidi.
Takze by ma zaujimalo, ako je mozne takyto problem riesit bez toho, aby sa kazdy riadok oznacil ako uz precitany a teda konzument tak nepreskocil zaznamy kvoli poradiu v ktorom su transakcie commitnute?