sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLのシリアル化可能なトランザクションがこれを競合と見なすのはなぜですか?

    この問題は、次のインデックスで修正できます。

    CREATE INDEX accounts_user_idx ON accounts(user_id);
    

    サンプルテーブルにはデータが非常に少ないため、PostgreSQLにインデックススキャンを使用するように指示する必要があります。

    SET enable_seqscan=off;
    

    これであなたの例はうまくいくでしょう!

    それが黒魔術のように思われる場合は、SELECTのクエリ実行プランを確認してください。 およびUPDATE ステートメント。

    インデックスがないと、どちらもテーブルでシーケンシャルスキャンを使用するため、テーブル内のすべての行が読み取られます 。したがって、両方のトランザクションはSIReadLockで終了します。 テーブル全体に。

    これにより、シリアル化の失敗がトリガーされます。



    1. テーブルの行が存在するかどうかをテストする効率的な方法

    2. BLOBフィールドPL/SQLから複数の値を読み取る

    3. 時間別のMYSQLの順序am/pm

    4. SQLテーブルから行のパーセンテージを選択しますか?