トランザクションが変更を実行すると、Postgres mvcc スキームが更新されたデータと関連するバージョンを含む新しい行を保存することを理解しています。
他のトランザクションは、表示すべきバージョンを認識しており、適切な行を選択します。
また、テーブルのプライマリ インデックスには行のすべてのバージョンが格納されることも理解しています。プライマリ インデックスを更新する方法を確認できます (書き込み用にロックし、行を追加し、ロックを解除します。これがどのように機能するかはわかりませんが、可能性のある方法です)。
しかし、Postgres はどのようにしてセカンダリ インデックスをアトミックに更新するのでしょうか? トランザクションがコミットされると、行の新しいデータですべてのインデックスを更新する必要があると思います。
Postgres はすべてのセカンダリ インデックスのロックを取得してアトミックに更新していますか? その場合、ロックの粒度はインデックス レベルですか、それとも値レベルですか (特定の値のインデックスの一部のみをロックします)?
InnoDB のような他の DB エンジンでもアプローチは同じですか?
おもちゃの DB を構築していますが、セカンダリ インデックスを効率的に更新する方法を理解するのに苦労しています。このトピックに関する論文も大歓迎です!
どうもありがとう!