sql >> Databáze >  >> RDS >> PostgreSQL

Uzamknout pro SELECT, aby jiný proces nezískal stará data

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


  1. Upgrade na PostgreSQL13

  2. Pokračování na Summer Performance Palooza 2013

  3. Podporuje váš ovladač Salesforce hromadné akce?

  4. Jak najít n-tou pozici v MySQL?