2003年11月16日 | dirty read | >> 目次 (テーマ ごと) |
以下を例にする。 |
時刻 a1 での データ (column) 状態 |
01 |
02 |
03 |
(1) 時刻 a2 のとき、以下の 2つの トランザクション が同時に実行された、とする。 - トランズ-1 (セット・アット・ア・タイム 法) - トランズ-2 (レコード・アット・ア・タイム 法)
(2) トランズ-1 が column のなかの データ 01 を読み込んだとき、
(3) トランズ-1 が column のなかの データ を、すべて、読み込んだときには、 |
時刻 a2 での データ (column) 状態 | 時刻 a2 での uncommitted 状態 |
01 | |
02’ | 02 |
03 |
(4) トランズ-1 は、以下の データ を読み込んだことになる。 (01、02’、03)
(5) トランズ-2 が、committed されないまま、バックアウト (ロールバック) した、とする。
つまり、トランズ-1 (セット・アット・ア・タイム 法) は、実際には無い データ を読み込んだことになる。
「dirty read」を回避するためには、トランザクション が実行された時刻での状態を 「最新状態」 として読み込むようにすればよい。つまり、以下の 2つの措置を取ればよい。 上述の例のなかで、time-stamping (時刻 a1 と時刻 a2) を使えば、以下のようになる。 |
時刻 a2 での データ (column) 状態 | 時刻 a2 での uncommitted 状態 |
01 (a1 ) | |
02’ (a2 ) | 02 (a1) |
03 (a1) |
そうすれば、トランズ-1 は、 a1 の time-stamping を付与された データ を、データ・バッファ (column) および uncommitted の バッファ のなかから読み込めばよい。したがって、読み込まれた データ は、以下のようになる。 (01、02、03) ORACLE では、time-stamping のことを SCN (System Change Number) といい、データ・バッファ のことを data segment といい、uncommitted 状態の バッファ のことを rollback segment という。 |
<< もどる | ベーシックス | すすむ >> | |
▼ データベースの基礎知識 |