Řešení takových problémů souběhu obvykle zahrnuje transakce a optimistické zamykání :když aktualizujete počítadlo, přidejte where
klauzule ke kontrole staré hodnoty a sčítání počtu aktualizovaných řádků.
v = select value from counter where id=x.
update counter set value = v+1 where value = v and id=x
Pokud bylo počítadlo mezitím aktualizováno, aktualizace nezmění žádný řádek – takže víte, že se musíte vrátit zpět a zkusit transakci ještě jednou.
Jedním z problémů je, že by to mohlo vést k vysokému konfliktu s pouze několika úspěšnými transakcemi a mnoha neúspěšnými.
Pak by mohlo být lepší držet se pesimistického zamykání , kde nejprve zamknete řádek a poté jej aktualizujete. Ale to vám řekne pouze benchmark.
UPRAVIT
Pokud použijete transakci bez optimistického zamykání, může nastat následující scénář.
Max authorized = 50. Current value = 49.
T1: start tx, read value --> 49
T2: start tx, read value --> 49
T1: update value --> 50, acquire a row lock
T1: commits --> release the lock
T2: update value --> 50, acquire a row lock
T2: commits --> release the lock
Obě transakce jsou úspěšné, hodnota je 50, ale existuje nesrovnalost.