sql >> Databáze >  >> RDS >> Mysql

Vložení řádku a vyhnutí se sporu (PHP/MySQL)

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



  1. dotaz není stejný nefunguje

  2. MySQL odstraňuje duplicitní záznamy

  3. Jak najít maximální hodnoty v řádcích

  4. Získejte první pondělí v měsíci v SQLite