2層コミットの設定・管理

2層コミットとは?

分散データベース環境で確実にトランザクションのACID属性を確保するための手法。詳しくは専門書を読んどくれ。

Oracle 7 における2層コミットの実装

関連サイトの選出

Oracleでは、トランザクションを行うアプリケーションの接続先がグローバル・コーディネータとなるが、トランザクションの中心となるサイトは「コミット・ポイント・サイト」として別に選出される。このサイトは、

という性質を持つ。どのサイトがコミット・ポイント・サイトになるかは、初期化パラメータCOMMIT_POINT_STRENGTH(0〜255の整数)の比較によって行われ、この値が最大のものが選出される。通常、データベースサーバとして安定なもの、また最大のデータを処理するものを選出すべきなので、各サーバに与える値はそれらを考慮して決定する。

デッドロックの検出

Oracleにおけるデッドロックの検出は、同一サイト内のトランザクションの場合は待ちグラフの解析によって行われるが、複数サイトにまたがるトランザクションの場合はタイムアウトによって検出される。タイムアウトの時間は初期化パラメータDISTRIBUTED_LOCK_TIMEOUTによって決定され、デフォルト値は60(秒)となっている。

1ノード当りの分散トランザクション数の制限

1ノード当りの分散トランザクション数の最大値は、初期化パラメータDISTRIBUTED_TRANSACTIONSで指定される。この値を超えて分散アクセスを要求するDML文を発行すると、その文はエラーを起こしてロールバックする。

システム変更番号の調整

分散トランザクションに参加する各ノードでは、別々のSCNが存在している。しかし、1つのトランザクションが複数サイトにまたがって発生した場合、そのトランザクションのSCNは各サイトで同一になる。そのSCNは、関連サイト間で最大のSCNが使用される。

インダウト・トランザクションの処理

コミット・ポイント・サイトでないサイトが準備命令を受け取ったままトランザクションが異常終了すると、そのサイト上のトランザクションは中途半端な状態(インダウト状態)に置かれることになる。通常、この状態は、グローバル・コーディネータのRECOプロセスによって自動的に復旧されるが、それを待つことのできない場合には、手動で回復処理を行うことになる。その手順は以下の通り。

  1. 起きているエラーを確認する。
  2. データディクショナリ表DBA_2PC_PENDINGビューから、問題の起きているトランザクションを発見する。
  3. データディクショナリ表DBA_2PC_NEIGHBORSビューから、他のサイトを発見し、そのサイトに連絡を取ってトランザクションの終了方法を確認する。
  4. COMMIT FORCE (トランザクション名)またはROLLBACK FORCE (トランザクション名)文を発行し、そのトランザクションを強制終了させる。

ここで、トランザクションを強制終了させるためには、自分が発行したトランザクションについてはFORCE TRANSACTION・他のユーザのトランザクションについてはFORCE ANY TRANSACTIONシステム権限が、それぞれ必要となる。
また、2層コミット失敗後に回復を待つための時間を設定するために、初期化パラメータDISTRIBUTED_RECOVERY_CONNECTION_HOLD_TIMEが存在する(デフォルトは200秒)。