Bạn có thể khắc phục sự cố này với chỉ mục sau:
CREATE INDEX accounts_user_idx ON accounts(user_id);
Vì có quá ít dữ liệu trong bảng ví dụ của bạn, bạn sẽ phải yêu cầu PostgreSQL sử dụng quét chỉ mục:
SET enable_seqscan=off;
Bây giờ ví dụ của bạn sẽ hoạt động!
Nếu điều đó có vẻ giống như ma thuật đen, hãy xem các kế hoạch thực thi truy vấn của SELECT
của bạn và UPDATE
tuyên bố.
Nếu không có chỉ mục, cả hai sẽ sử dụng quét tuần tự trên bảng, do đó đọc tất cả các hàng trong bảng . Vì vậy, cả hai giao dịch sẽ kết thúc bằng một SIReadLock
trên toàn bộ bảng.
Điều này gây ra lỗi tuần tự hóa.