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

Minimální příklad použití select... pro aktualizaci za účelem izolace řádků

SELECT ... FOR UPDATE uzamkne řádek(y) ve výhradním režimu, což znamená, že druhý výběr nemůže pokračovat, dokud nebude první dokončen nebo vrácen zpět. Je to proto, že výsledek druhého výběru by mohl být ovlivněn obsahem řádku, který jste zamkli, takže je potřeba získat zámek pro čtení na řádek, který chcete zkontrolovat.

Pokud vytvoříte UNIQUE INDEX například na id , můžete to udělat;

select * from SolrCoresPreallocated where id=1 for update;

v první transakci a;

select * from SolrCoresPreallocated where id=2 for update;

ve druhém nezávisle, protože jedinečný index umožňuje druhému výběru najít správný řádek bez zamykání prvního řádku.

EDIT:Chcete-li získat řádek „zdarma“ co nejrychleji, jediným způsobem je skutečně provést dvě transakce;

  • ZAČNĚTE/VYBERTE PRO AKTUALIZACI/AKTUALIZACI, pokud je zaneprázdněno/COMMIT, abyste získali řádek.
  • ZAČÁTEK/<řádek zpracovat>/UPDATE pro uvolnění/POTVRDIT pro zpracování řádku a jeho uvolnění.

To znamená, že možná budete potřebovat kompenzační akce v případě, že proces selže a vrátí transakci, která by AKTUALIZOVALA řádek na uvolnění, ale protože MySQL (nebo standardní SQL v tomto případě) nemá pojem „získat další odemčený řádek “, nemáte mnoho možností.




  1. Jak nechat Android App komunikovat s externí MySQL db

  2. Zjistil někdo, že REGEX \b nefunguje v MYSQL?

  3. Jak získám výsledek přes 2 tabulky

  4. Docker mysql se nemůže připojit ke kontejneru