PostgreSQL では、MVCC 同時実行制御メカニズムは次のように述べています。
データのクエリ (読み取り) のために取得された MVCC ロックは、データの書き込みのために取得されたロックと競合しないため、読み取りによって書き込みがブロックされることはなく、書き込みによって読み取りがブロックされることもありません。
したがって、READ_COMMITTED の場合でも、 UPDATE ステートメントは現在影響を受けている行をロックするため、現在のトランザクションがコミットまたはロールバックされるまで、他のトランザクションはそれらを変更できません。
並行トランザクションがロックされた行に対して UPDATE を発行すると、最初のトランザクションがロックを解放するまで、2 番目のトランザクションはブロックされます。
この動作は、書き込みと書き込みの競合を防止しようとしていますか?
最初のトランザクションがコミットされた後、2 番目のトランザクションが行を上書きするため (UPDATE クエリの開始とクエリの終了の間にデータベースが変更された場合でも)、更新の損失は READ_COMMITTED でも発生する可能性があります。それでも更新が失われる可能性がある場合、2 番目のトランザクションを待たなければならないのはなぜでしょうか? 行レベルのスナップショットを使用してコミットされていないトランザクションの変更を保存し、トランザクションが書き込みロックが解放されるのを待たなければならないのを回避できませんでしたか?