2017-11-23 7 views
0

PostgresSQLのは言う:読者と作家

読者は、作家や作家のユーザーをブロックしないをふさがないようにしてください。

SERIALIZABLE分離レベルとしましょう。

素晴らしい!しかし、それはどのように可能ですか?

  1. Readerは、読者のスナップショットが取られた後の作家によって行われたコミットの変更が表示されません。
  2. したがって、彼は独自のスナップショットを持っているため、トランザクション中にReaderをブロックする必要はありません。
  3. しかし....スナップショットをブロックしていますか?スナップショットの作成中にライターコミットが変更された場合、スナップショットは矛盾する可能性があるため、ブロックされている必要があります。

  4. だから、それはそれを意味し:

    読者は、作家や作家のユーザーをブロックしないをふさがないようにしてください。

...しかしsnaphotブロックを取ります。

:)

+0

[Postgresがトランザクションをどのように原子的にするか](https://brandur.org/postgres-atomicity)はおそらく読む価値があります。 –

答えて

1

Postgresは同時実行を処理するためにmultiversion concurrency control(MVCC)を使用することを私に説明してください。つまり、UPDATEが実際に既存のデータを変更するのではなく、そのデータを「削除済み」としてマークし、現在のトランザクションIDでタグ付けし、まったく新しいレコードを作成するということです。以前のバージョンはまだそこにあり、それを必要とする人にはまだ見えます。

"スナップショットを撮る"には実際にデータをコピーする必要はありません。その時点でコミットされていないすべてのトランザクションのIDを記録することが多かれ少なかれ、サーバがテーブルをスキャンしている間にそのエフェクトを除外することができます。

さらに詳しい説明は、Bruce MomjianのMVCC Unmaskedを参照してください。

関連する問題