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 という。





  << もどる HOME すすむ >>
  ベーシックス