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

Jak se ujistit, že v databázi MySQL není při inkrementaci pole žádný spor?

Zde jsou 3 různé přístupy:

Aktuální aktualizace

update table set tries=tries+1 where condition=value;

a bude to provedeno atomově.

Používejte transakce

Pokud potřebujete nejprve vybrat hodnotu a aktualizovat ji ve své aplikaci, pravděpodobně budete muset použít transakce. To znamená, že budete muset použít InnoDB, ne tabulky MyISAM. Váš dotaz by byl něco jako:

BEGIN; //or any method in the API you use that starts a transaction
select tries from table where condition=value for update;
.. do application logic to add to `tries`
update table set tries=newvalue where condition=value;
END;

pokud se transakce nezdaří, možná ji budete muset zkusit znovu ručně.

Schéma verze

Běžným přístupem je zavedení sloupce verze do tabulky. Vaše dotazy budou vypadat takto:

select tries,version from table where condition=value;
.. do application logic, and remember the old version value.
update table set tries=newvalue,version=version + 1 where condition=value and version=oldversion;

Pokud se aktualizace nezdaří/vrátí 0 dotčených řádků, mezitím tabulku aktualizoval někdo jiný. Musíte začít znovu – to znamená vybrat nové hodnoty, provést aplikační logiku a zkusit aktualizaci znovu.



  1. Je vnitřní spojení stejné jako ekvi-spojení?

  2. pyodbc a mySQL

  3. MySQL vyberte součet s hodnotami seskupit podle a prázdnými hodnotami

  4. Problém s backtickem Bash + MySQL -d