Tento problém můžete vyřešit pomocí následujícího indexu:
CREATE INDEX accounts_user_idx ON accounts(user_id);
Protože ve vaší vzorové tabulce je tak málo dat, budete muset PostgreSQL sdělit, aby použil indexové skenování:
SET enable_seqscan=off;
Nyní bude váš příklad fungovat!
Pokud to vypadá jako černá magie, podívejte se na plány provádění dotazů vašeho SELECT
a UPDATE
prohlášení.
Bez indexu oba použijí sekvenční prohledávání tabulky, čímž se přečtou všechny řádky v tabulce . Obě transakce tedy skončí s SIReadLock
na celý stůl.
To způsobí selhání serializace.