sql >> Databasteknik >  >> RDS >> PostgreSQL

Varför anser PostgreSQL serialiserbar transaktion att detta är en konflikt?

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.



  1. Problem med MySQL:s AES_DECRYPT

  2. Design av fakturatabell

  3. ORA-12899, medan verkligt värde är mindre än max

  4. DATEDIFF_BIG() Exempel i SQL Server