Du kan åtgärda det här problemet med följande index:
CREATE INDEX accounts_user_idx ON accounts(user_id);
Eftersom det finns så få data i din exempeltabell, måste du säga till PostgreSQL att använda en indexskanning:
SET enable_seqscan=off;
Nu kommer ditt exempel att fungera!
Om det verkar som svart magi, ta en titt på exekveringsplanerna för din SELECT
och UPDATE
uttalanden.
Utan index kommer båda att använda en sekventiell skanning av tabellen, och därigenom läsa alla rader i tabellen . Så båda transaktionerna kommer att sluta med en SIReadLock
på hela bordet.
Detta utlöser serialiseringsfelet.