2003年11月16日 dirty read >> 目次 (テーマ ごと)


 
 セット・アット・ア・タイム 法と レコード・アット・ア・タイム 法を併用すれば、いわゆる 「dirty read」 という問題が起こる。「dirty read」 は、「uncommitted 状態の更新 データ を読み込む」 ことをいう。

 以下を例にする。

時刻 a1 での データ (column) 状態
01
02
03

 (1) 時刻 a2 のとき、以下の 2つの トランザクション が同時に実行された、とする。
    - トランズ-1 (セット・アット・ア・タイム 法)
    - トランズ-2 (レコード・アット・ア・タイム 法)

 (2) トランズ-1 が column のなかの データ 01 を読み込んだとき、
    トランズ-2 が データ 02 を更新した、とする (更新後の データ は、02’ とする)。

 (3) トランズ-1 が column のなかの データ を、すべて、読み込んだときには、
    トランズ-2 の更新は、まだ、committed されていない、とする。



時刻 a2 での データ (column) 状態 時刻 a2 での uncommitted 状態
01  
02’ 02
03  

 (4) トランズ-1 は、以下の データ を読み込んだことになる。
    (01、02’、03)

 (5) トランズ-2 が、committed されないまま、バックアウト (ロールバック) した、とする。
    したがって、column の データ は、以下の状態になる。
    (01、02、03)

 つまり、トランズ-1 (セット・アット・ア・タイム 法) は、実際には無い データ を読み込んだことになる。
 これを 「dirty read」 という──すなわち、「uncommitted 状態の データ を読み込むことをいう。

 「dirty read」を回避するためには、トランザクション が実行された時刻での状態を 「最新状態」 として読み込むようにすればよい。つまり、以下の 2つの措置を取ればよい。
  - (更新を追跡できるように) time-stamping を導入する。
  - uncommitted 状態と committed 状態を仕訳する。

 上述の例のなかで、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 という。





  << もどる ベーシックス すすむ >>
  データベースの基礎知識