ITL (Interested Transaction List)

ITL とはデータブロック内に配置され、データブロック内の変更情報を管理しているリスト構造で UNDO 領域への中継役。マルチバージョニングによる読み取り一貫性にも使用されている。

トランザクション による行レベルのロックは、このリストの情報により排他制御されている。
ブロックヘッダだけでなく空き領域(データ領域)も使用して管理されている。ITL が不足すると MAXTRANS まで自動的に拡張する。(10g では MAXTRANS は設定できない:常に 255 になる) 1 エントリ毎に KTBIT(24 バイト) の大きさを必要とする。

注意
領域不足などで ITL を拡張できない場合、トランザクションは待機状態になる。
これは ITL が空き領域 (PCTFREE) も使用しているために発生する。リスト数の上限 (MAXTRANS で指定した数値)は、あくまでも設定の上限値であり空き領域が不足していれば確保できないこともある。
PCTFREE による空き領域が既にない状態*1では、 このロックによるトランザクション処理の遅延の危険性が高くなっていると思われる。

MAXTRANS と空き領域の関係

データブロックのヘッダおよびデータ領域に MAXTRANS 個の ITL が確保できる保証はない。 実際に確保できる上限の数は PCTFREE による空きブロックだけでなく、ブロックの未使用領域領域にも影響されているようである。
10g の環境だったため、MAXTRANS を設定できなかった。(指定しても 255 になる)

以下 検証用 スクリプト(データブロック 8K)

DROP TABLE ITL_SAMPLE;
CREATE TABLE ITL_SAMPLE( XXX CHAR(1 BYTE) )
PCTFREE 0 
INITRANS 1;
---- データブロックをすべて埋め尽くす
DECLARE
	i NUMBER;
BEGIN
	FOR i IN 1..10000 LOOP
		INSERT INTO ITL_SAMPLE VALUES (mod(i,10));
	END LOOP;
	COMMIT;
END;
/
  • SESSION A で実行
UPDATE ITL_SAMPLE SET XXX='a' WHERE XXX='0' AND ROWNUM <= 1;
..OK
  • SESSION B で実行
UPDATE ITL_SAMPLE SET XXX='b' WHERE XXX='1'AND ROWNUM <= 1;
..OK

2 スロット目をなぜ確保できたか? これは、KTBBH(固定トランザクションヘッダ領域)で 2つ分確保されるためによる。
INITRANS が 2以上の場合には、KTBIT×(INITRANS-1) の領域が別に確保される。 ⇒ データブロック

  • SESSION C で実行........ ITL wait
UPDATE ITL_SAMPLE SET XXX='c' WHERE XXX='2'AND ROWNUM <= 1;
..ITL wait で ロック待ちになる。

SESSION A or B の COMMIT/ROLLBACKで .. C は完了

PCTFREE を 1 にすると問題なく動作した。(PCTFREE 0 で)データを埋め尽くさない場合でも動作した。
条件の ROWNUM <= 1 を ROWNUM <= 10にしても動作する。(ITL が行ディレクトリ単位ではなくトランザクション単位で管理されていることをあらわす)



データブロック操作 関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ 会員制(無料)の公式技術サイト

*1 行連鎖行移行が発生しているデータブロックでは、その確率はより高い