[DB] ダーティリード・ノンリピータブルリード(ファジーリード)・ファントムリードの違い

どうも、tatsuです!

今回はデータベースのトランザクションにおける独立性阻害要因の違いについて書いていこうと思います。

トランザクションとは?

簡単に説明すると、トランザクションとはいくつかの処理をまとめた一連の処理のことを指します。
もう少し詳しい説明は以下の記事を参考にしてください。Androidアプリ開発での説明ですが、トランザクションの概念については同じです。

[Android Studio] トランザクションとは?

2017.08.10

ISOLATIN LEVEL

トランザクションが複数実行中の場合、それぞれのトランザクションが他のトランザクションに影響を与えるレベルのことをISOLATION LEVELと言います。
ISOLATION LEVELは以下の4つに分けられます。

READ UNCOMMITTED

READ UNCOMMITTEDはもっともトランザクションの分離レベルが低いため、速度は速いです。
しかし、他のトランザクションがコミット前のデータを読んでしまう可能性があります(ダーティリード)。
発生する独立性阻害要因は、ダーティリード・ノンリピータブルリード・ファントムリードです。

READ COMMITTED

READ COMMITTEDは他のトランザクションがコミットしたデータだけ読み込むため、ダーティリードを防ぐことができます。
しかし、トランザクションの中で一度参照したデータが、同一トランザクション内でもう一度読み込んだときに違う結果を返す可能性があります(ノンリピータブルリード・ファントムリード)。
発生する独立性阻害要因は、ノンリピータブルリード・ファントムリードです。

REPEATABLE READ

REPEATABLE READは同一トランザクション内で同じデータを複数読み込んでも同じ結果を返します。
つまり、あるトランザクションで読み込んでいるデータを他のトランザクションが更新することを防ぐことができます。
しかし、更新ではなく行の追加や削除は行うことができます(ファントムリード)。
発生する独立性阻害要因は、ファントムリードです。

SERIALIZABLE

SERIALIZABLEは日本語で直列化と言われ、複数のトランザクションが互いに完全に干渉しません。
よって独立性阻害要因は発生しませんが、各トランザクションの”待ち”が増えるため、速度は遅くなります。

独立性阻害要因

独立性阻害要因であるダーティリード・ノンリピータブルリード・ファントムリードについて詳しく説明します。

ダーティリード

ダーティリードは、他のトランザクションがコミット前のデータを読み込んでしまいます。
コミット前のデータを読んでしまうと、そのデータがロールバックされた場合に存在しない更新を処理してしまいます。

ノンリピータブルリード(ファジーリード)

ノンリピータブルリードは、同一トランザクション内で同じデータを複数読み込んだ場合に違う結果を返す可能性があります。
同一トランザクション内で違う結果が返ると、例えば以下のようなことが起きます。
例)ショッピング処理で在庫が残り1つのものをカートに入れて決済完了。しかし、決済中にほぼ同タイミングの別ショッピング処理が行われ在庫が0になっていて、決済したにもかかわらず商品在庫が無い状態になる。
※通常のショッピング処理では決済前にノンリピータブルリードが起きないように制御し、決済前のある時点からカートの商品在庫は他トランザクションによって更新されないようになっているはずです。

ファントムリード

ノンリピータブルリードでは行の更新でしたが、ファントムリードは行の追加や削除をされてしまう可能性があります。
行の追加や削除が行われることで、例えば読み込んだ行数を使って処理をしていた場合等に不整合が起きてしまいます。

ISOLATIN LEVELと独立性阻害要因の関係

ISOLATIN LEVELと独立性阻害要因の関係を図に表すと、下図のようになります。

まとめ

いかがでしたか?
今回はダーティリード・ノンリピータブルリード(ファジーリード)・ファントムリードの違いについて記事にしてみました!
またデータベースについての備忘録をどんどん残していきたいと思ってます。
それでは!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です