この問題は、次のインデックスで修正できます。
CREATE INDEX accounts_user_idx ON accounts(user_id);
サンプルテーブルにはデータが非常に少ないため、PostgreSQLにインデックススキャンを使用するように指示する必要があります。
SET enable_seqscan=off;
これであなたの例はうまくいくでしょう!
それが黒魔術のように思われる場合は、SELECT
のクエリ実行プランを確認してください。 およびUPDATE
ステートメント。
インデックスがないと、どちらもテーブルでシーケンシャルスキャンを使用するため、テーブル内のすべての行が読み取られます 。したがって、両方のトランザクションはSIReadLock
で終了します。 テーブル全体に。
これにより、シリアル化の失敗がトリガーされます。