Можете да коригирате този проблем със следния индекс:
CREATE INDEX accounts_user_idx ON accounts(user_id);
Тъй като във вашата примерна таблица има толкова малко данни, ще трябва да кажете на PostgreSQL да използва сканиране на индекс:
SET enable_seqscan=off;
Сега вашият пример ще работи!
Ако това изглежда като черна магия, погледнете плановете за изпълнение на заявката на вашия SELECT
и UPDATE
изявления.
Без индекса и двете ще използват последователно сканиране на таблицата, по този начин ще прочетат всички редове в таблицата . Така че и двете транзакции ще завършат с SIReadLock
върху цялата маса.
Това задейства неуспешната сериализация.