- [[Isolation|トランザクション分離レベル]]の一つ
- それぞれの[[トランザクション]]が、データベースの一貫性のあるスナップショットから読み取りを行う
- ここでの一貫性は、因果関係において一貫している、という意味
- [[Nonrepeatable read]]とかは、因果律に違反が生じている状態での読み取りに当たる
- トランザクションが読み取る値は、すべてそのトランザクションの開始時点でコミット済みだったものだけということを保証
- [[Optimistic Concurrency Control]]
- 「リーダーはライターをブロックせず、ライターはリーダーをブロックせず」
- 並行するトランザクション間のread-writeは、お互いにブロックしない
- Snapshot取ってるので、OK
- [[Multiversion Concurrency Controll]]が使われる
- Snapshot Isolationでも、[[Write skew]]は起きる
- 以下4つの組み合わせとして定義される
- [[Internal Consistency]]: トランザクション内では、読み取り操作はそのトランザクションの最新の書き込み操作の結果を観察する(書き込みがあれば)
- [[External Consistency]]: `T1`において専攻する書き込み操作がない読み取り操作は、`T0`によって書き込まれた状態を観察しなければならない。ここで、`T0`は`T1`から可視であり、かつより新しいトランザクションがそのオブジェクトに書き込みを行っていないものを指す。
- [[Prefix]]: トランザクションは全ノードに対して同一順序で見える
- [[No Conflits]]: 同一オブジェクトへの書き込みを行う2つのトランザクションは、どちらかがもう一方に対して可視である必要がある
# 参考
- [Snapshot Isolation - Jepsen](https://jepsen.io/consistency/models/snapshot-isolation)
- 初めて提案された論文: [[A Critique of ANSI SQL Isolation Levels]]