トランザクション隔離レベルとファントム
ANSI/SQL規格では同時に実行されるトランザクションの隔離レベルを識別するために、防ぐべき3つの事象が分類されている。トランザクションの解説でよく目にするだろう。
- ダーティ読み取り(Dirty Read)
- 反復不の読み取り(Non-Repeatable Read)
- ファントム読み取り(Phantom Read)
恥かしいことだが、私はいつもこの3つの中の後者二つがどっちだったか判らなくなるのである。これらを明確に区別する良い方法は無いかと探していたのだが、どうやらこの事象を以下のように分類して解説している文献やサイトもあることが判った。
- ロストアップデート(Lost Update)
- ダーティリード(Dirty Read)
- ノンリピータブルリード(Non-Repeatable Read)
- ファントムインサート(Phantom Insert)
同じファントムでもこの分類での解説では
他のトランザクションがその条件に影響を与える行の挿入を行ったために、先に読み込んだ行と後に読み込んだ行が異なってしまうこと
と挿入時に発生する自称に限定して解説しているので、ノンリピータブルリードとの違いが非常に明確である。よく見るのは最初に書いた分類だが、一体どちらがSQL規格として正式な解説なのだろう。
追記:
正式な仕様を調べてみようとSQL規格を入手しようと思ったのだが、SQLは正式なISO規格文書なのでPDFのダウンロードであっても買わなくてはならないようだ。