トランザクション・分離レベルに関する用語
ノンリピータブル・リード (Nonrepeatable Read / Fuzzy Read)
日本語マニュアルにおいての訳は「非リピータブル・リード」となっている。オラクル以外では「否リピータブル〜」や「反復不可能な読み取り」などと訳されているようであるが、しっくりとこない。
Fuzzy read (ファジー・リード/あいまいな読み取り)の方が内容を理解しやすいかも。
ノンリピータブル・リードとは、例えばリアルタイムで更新される在庫管理テーブルがあるとする。
T1 から今現在、在庫数が 1000 以上の商品一覧を問い合わせる。このときに T2 から商品が出荷されたり、入荷されて正しくコミットされているとする。
T1 から再度、同じ問い合わせをしたときに該当する商品一覧が T2 の コミット の前後で異なる結果を戻してしまうこと。(データが削除されていることも含まれる)
もっと簡単に言い換えると、同じ問い合わせを二回連続して繰り返し(リピート)ても同じ結果になると「保証できません」ということになる。
逆に保証される状態がリピータブル・リードということになる。(Oracle ではリピータブル・リード分離レベルは存在しない)
ファントム(ファントム・リード) (Phantoms / Phantom Read)
オラクルの日本語マニュアルにおいての訳は「仮読み取り」
(正確には「仮読取り」。仮?何故に…この訳なのだろう:最初に何の事かわからなかった。この用語の浸透率は相当に低そう)
ファントムとは、直訳で幻影、幻、言葉どおりにタイミング次第で見えなかったものが突如出現するデータのことである。
これは、T1 から問い合わせ、T2 から新商品の登録を行なった場合に T2 のコミットの前後で T1 の問い合わせに以前は存在しなかったものが出現すること。
ノン・リピータブル・リードは、既存のデータが「更新(削除)」されることであるが、
ファントム・リードとは、前回は存在していなかったものが同じ問い合わせで「出現」することに違いがある。
補足:存在したものの過去の像を見せることと、現在は存在し過去には存在しなかったものを今も存在しないように見せるとの違いはシステム上では大きな差がある。
ダーティー・リード (Dirty Read)
ダーティー・リードとは、トランザクション1(以下 T1) とトランザクション2(以下 T2) が並列して処理されている場合において
T1 において あるデータを A から B に更新した(まだ COMMIT していない)とする。
このとき T2 から おなじデータを問い合わせたときにまだ未コミット状態の B のデータを問い合わせの結果として戻している状態のことをあらわす。
Oracle では常に読取り一貫性があり、サポートしている 分離レベル において、この現象は発生することはない。
関連事項