Vaše otázka odkazující na neznámý zdroj:
Podíval jsem se na zamykání řádků, ale říká, že nemůžete zabránit příkazům select, což zní, že to zde nebude fungovat pro můj stav. Je jediná možnost použití poradních zámků?
Oficiální dokumentace k této záležitosti:
Zámky na úrovni řádků neovlivňují dotazování na data; blokují pouze pisatele a skříňky do stejného řádku.
Souběžné pokusy nejen vyberou, ale pokusí se odstranit stejný zámek na úrovni řádku pomocí SELECT ... FOR UPDATE
- což způsobí, že budou čekat na jakoukoli předchozí transakci se zámkem na stejném řádku, aby se buď potvrdili, nebo vrátili zpět. Přesně to, co jste chtěli.
Nicméně , mnoho případů použití se lépe řeší pomocí poradních zámků - ve verzích před 9.5. Zpracovávané řádky můžete stále uzamknout pomocí FOR UPDATE
navíc pro jistotu. Pokud ale další transakce chce zpracovat pouze „další volný řádek“, je to často moc efektivnější nečekat na stejnou řadu, která je po uvolnění zámku téměř jistě nedostupná, ale okamžitě přejít na „další volnou“.
V Postgresu 9.5+ zvažte FOR UPDATE SKIP LOCKED
pro tohle. Jak poznamenal @Craig, může to z velké části nahradit poradní zámky.
Související otázka narážející na stejného výkonného prase:
- U velkého počtu záznamů trvá běh funkce věčně
Vysvětlení a příklad kódu pro poradní zámky nebo FOR UPDATE SKIP LOCKED
v Postgresu 9.5+:
- AKTUALIZACE Postgresu... LIMIT 1
Chcete-li uzamknout mnoho řádků najednou :
- Jak označit určitý počet řádků v tabulce při souběžném přístupu