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