
214
導
入
編
1
設
計
編
ア
キ
テ
ク
チ
ャ
編
2
3
4
5
6
7
4
ば、ABCが参照できます。
次に、スレッド2が同じトランザクションの中で、データベースの同じ
データを2回参照したとします。同時にスレッド1が同じデータを更新して
います。スレッド2の2回目の参照はどのような値になるでしょうか? ポイ
ントは、トランザクション1がコミットされてから、トランザクション2が
データを参照していることです(図4-9)。
スレッド1
データベース
スレッド2
トランザクション1
トランザクション2
???
XYZ
ABC
処理
処理 処理 処理
更新
参照 参照
図
4
-
9
:参照のタイミング
これは、ノンリピータブルリードの問題です。アイソレーションレベルが
READ_COMMITTEDであれば、コミットされたデータを参照できるので、
2回目の参照ではXYZが参照できます。これには問題があるかもしれませ
ん。スレッド2では、同じトランザクションの中で同じデータを2回参照し
たにもかかわらず、2回の参照でABCとXYZというように異なる値になっ
ています。これでは、トランザクションにおけるデータの整合性は保たれま
せん。そこで、アイソレーションレベルをREPEATABLE_READにすること
で、2回の参照で同じABCを値として参照できるようになります。
ここまでは、同じデータを更新(UPDATE)し、参照(SELECT)する場合
の話です。さらに踏み込んで考えてみましょう。例えば、データ(行)を作
成(INSERT)し、 ...