Możesz rozwiązać ten problem za pomocą następującego indeksu:
CREATE INDEX accounts_user_idx ON accounts(user_id);
Ponieważ w twojej przykładowej tabeli jest tak mało danych, będziesz musiał powiedzieć PostgreSQL, aby użył skanowania indeksu:
SET enable_seqscan=off;
Teraz twój przykład zadziała!
Jeśli wydaje ci się to czarną magią, spójrz na plany wykonania zapytań Twojego SELECT
i UPDATE
oświadczenia.
Bez indeksu obaj użyją sekwencyjnego skanowania tabeli, w ten sposób odczytując wszystkie wiersze w tabeli . Tak więc obie transakcje zakończą się SIReadLock
na całym stole.
Powoduje to niepowodzenie serializacji.