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

Má v PostgreSQL více UPDATES na různé řádky ve stejné tabulce konfliktní zámky?

UPDATE uzamkne řádek, takže jej nemusíte nejprve zamykat. Pokud se pokusíte UPDATE překrývající se sady řádků současně, druhý UPDATE bude čekat na potvrzení nebo vrácení transakce první.

Velký problém s vaším přístupem - kromě skutečnosti, že UPDATE nemá LIMIT klauzule - je, že více pracovníků se pokusí zachytit stejné řádky. Zde je to, co se stane:

  • pracovník1:Filtruje tabulku tak, aby nalezla 200 řádků a uzamkla je
  • pracovník1:zahájí aktualizaci řádků
  • pracovník2:filtruje tabulku a najde 200 řádků
  • pracovník2:pokusí se zahájit aktualizaci řádků, ale vybral stejné řádky jako pracovník1, takže blokuje na zámku pracovníka1
  • pracovník1:Dokončí aktualizaci řádků
  • worker2:Po uvolnění zámku znovu zkontroluje podmínku WHERE a zjistí, že žádný z řádků již neodpovídá, protože je worker1 aktualizoval. Aktualizuje nula řádků.

... a opakujte!

Musíte buď:

  • Mějte centrální frontu předávání řádků řádným způsobem bezpečným pro souběžnost; nebo
  • Přidělte pracovníkům nepřekrývající se rozsahy ID, se kterými budou pracovat

Pokud jde o LIMIT - můžete použít WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id) - ale měli byste stejný problém s tím, že by oba pracovníci zvolili stejnou sadu řádků k aktualizaci.



  1. Postgres SELECT* FROM tabulka WHERE column-varchar==string-example?

  2. křižovatky many-to-many a many-to-many

  3. Statistika čekání na koleno:PAGEIOLATCH_SH

  4. Jak spustit uloženou proceduru z SQL Plus?