# CHAPTER 6: ウォームリスタートとトランザクション

## 6.1 はじめに

トランザクション中にシステム障害が発生した場合、 ウォームリスタート機能はユーザーデータの保護を保証します。 実行中のタスクで障害が発生した場合、あるいはオペレーティングシステムの障害、 また、ディスク障害のために処理が中断された場合、 ウォームリスタート機能により、データベースを一貫性のある状態に復旧することができます。 （失敗したときにトランザクション中の実行されたデータベース操作も提供されます。）

ウォームリスタートがデータベースを復旧させるためには、ディスクが壊れていないことが必要です。 ディスクから物理的なデータがかけていた場合は、`emprecov`ユーティリティを用いて アーカイブデータベースから復旧する必要があります。

また、ウォームリスタートがデータベースの一貫性を保証するためには、 Empress変数`MSTRANSSYNC`を設定する必要があります。 この変数を設定するとトランザクション中の全てのデータが瞬時にディスクに書き込まれます。

Empressでトランザクションを実行する場合、トランザクション中のすべての操作を 永久的データベースへすべてコミットするか、あるいはすべての操作をロールバックするか いずれか1つの手段がとられます。 万一、トランザクション中にシステム障害が発生した場合、 トランザクションは未解決であり、 そのデータベースは矛盾あるいは正しくないデータを持つことになります。 ウォームリスタート機能は、影響を受けたデータベースをリセットし、 中断したすべてのトランザクションを復旧させます。 データベースが再開された場合、そのデータベースが対象とする 中断したトランザクションは、完了する（コミット）かロールバックされます。

以下にデータベースの再開に使用可能なユーティリティと問い合わせ言語、 およびトランザクションが完了（コミット）するかあるいはロールバックするかを 左右する条件について説明します。

## 6.2 自動ウォームリスタートユーティリティ - empwarm

`empwarm` ユーティリティは、自動ウォームリスタートユーティリティです。 以下のようにデータベース上で実行できます。

       empwarm [-p] [-v] database

ここでの`database`は、データベース名を指します。

`-p`オプションは、トランザクション保護を無効にし、 そのため保護中のトランザクションは解決されます。 `-v`オプションは、冗長モードでウォームリスタートを実行します。

自動ウォームリスタートユーティティは、実行可能な場合は常に割り込みを 受けたトランザクションを完了します。 つまり、トランザクションをコミットする問い合わせ言語コマンドが既に入力され、 システム障害の発生する前にデータベースにそのコマンドを受け取った場合、 トランザクションは完了されます。 トランザクションをコミットするコマンドが入力されないか、 あるいはデータベーズが受け取っていない場合は、 トランザクションはロールバックされます。

ウォームリスタート機能はトランザクションの長さに関わりなく、 自動的にそれぞれのトランザクションを処理します。 (トランザクションの長さはあらかじめ定義された制限はありません。) それぞれのトランザクションは、1単位として制御されます。 トランザクションがコミットされた場合、トランザクション中のすべての操作が コミットされ、また、トランザクションがロールバックされた場合は、全ての操作が ロールバックされます。

ウォームリスタートユーティリティは、データベース上で繰り返し実行できます。 例えば、ウォームリスタート実行中にシステム障害が発生した場合には、ウォームリスタート を再開することで、全てのデータを一貫性のある状態に復旧させることができます。 ウォームリスタートユーティリティは、ユーザーデータベースを壊したり、損傷を与える ことはありません。

トランザクションは保護されることで、中断した時のセーブポイントまで 復旧することが可能となり、この場合はウォームリスタートユーティリティによって 無視されます。この手順については、後のセクションで説明します。 `-p`オプションが指定し`empwarm`を実行すると、 トランザクション保護は無効となり、保護されていたトランザクションも解決されます。

トランザクションは複数のデータベース内のテーブルに影響を与えます。 通常はこのように複数のデータベースに影響を与えるトランザクションは単一のトランザクション として処理されますが、Empress 内部では関係する各データベースについて、別々の トランザクションとして管理され、処理されます。 このような状況でのデータの整合性を保持するために、トランザクションプロセスは ツゥーフェーイズコミットプロトコルを使用して処理が行われます。

ウォームリスタートユーティリティは、複数のデータベースにわたるトランザクションを 認識し、ツゥーフェーイズコミットプロトコルによりすべての影響を受けるデータベースを 保護するために実行されます。 トランザクションの実行は1単位として制御され、ウォームリスタートユーティリティは、 関係のあるすべてのデータベース上のトランザクションを解決するため（コミットまたは キャンセル）、データベースの一貫性が保たれます。 通常の状態では、トランザクション中に影響を受ける個別のデータベースについて 注意を払う必要はありません。

## 6.3 複数データベース上でのトランザクション

トランザクションが複数のデータベースにわたっている場合、最初にアクセスされた データベースがそのトランザクションに対するコーディネータとなります。 トランザクションに関係するほかのデータベースは、パーティシパントと して認識されます。

自動ウォームリスタートの場合、トランザクションがコミットするかロールバックするかの 最終的な決定は、コーディネータの状態によります。 コーディネータは、自分自身および関係する他のデータベースのためのトランザクションの 進行に関する情報を持っています。 （システム障害後にトランザクション上で行われたアクションも含みます。）

コーディネータは、常にトランザクションステータスに関する全ての情報が与えられます。 ウォームリスタートが必要な場合、コーディネータはトランザクションをコミットするか ロールバックするかを常に決定することができます。 多くの場合、パーティシパントもトランザクションステータスに関する情報を持ち、 トランザクションをコミットするかロールバックするかを判断することができます。 しかし、トランザクション中にパーティシパントは正しいアクションを決定するために 瞬間的にコーディネータにアクセスする必要があります。

ウォームリスタートユーティリティは、データベースでの実行中にそのデータベースに 関連したシステム障害処理中のトランザクションを見つけることがあります。 その各トランザクションを見つけるたびにデータベース上でトランザクションを復旧させるための 正しい処理方法を決定する必要があります。 そのため、そのデータベースがコーディネータであるトランザクションの場合は トランザクションステータスが決定され、適切なアクションが行われます。 また、データベースがパーティシパントである場合は、トランザクションステータスを 判断しようと試みますが、処理はおこなわれません。

### 6.3.1 コーディネータのウォームリスタート

自動ウォームリスタートユーティリティがコーディネータ上で実行される場合、 トランザクションはコミットすべきか、あるはロールバックすべきかどうかを決定します。 すべてのパーティシパントがアクセス可能である場合、影響を受けるすべてのデータベース上で 完全なコミットまたはロールバックを実行します。

パーティシパントのある部分がアクセスできない場合（例えばネットワーク障害のために）は、 コーディネータとアクセス可能なパーティシパント上のすべての操作をコミットまたは ロールバックし、実行不可能な未解決のタスクに関する情報を表示します。 ウォームリスタートはその実行されなかったパーティシパントがアクセス可能なときは コーディネータ上で繰り返し再実行することができます。未解決の操作にはこのようなコミット およびロールバックが適切に実行されます。

ウォームリスタートは冗長モードで実行することができ、コーディネータならびに すべてのパーティシパントに関するステータス情報が、各トランザクションでの アクションが行われる直前に表示されます。

### 6.3.2 パーティシパントでのウォームリスタート

自動ウォームリスタートユーティリティがパーティシパント上で実行される場合、 トランザクション上でのアクションは一切行われません。 ウォームリスタートユーティリティはトランザクションがコミットするべきかロールバックすべきかを 決定するために、コーディネータデータベースにアクセスし、トランザクションステータスを確認します。

ウォームリスタートユーティリティが冗長モードで実行された場合、 ステータス情報はトランザクションステータスに応じて3つの方法で表示されます。

1. トランザクションステータスが明白に決定できる場合は、コーディネータは アクセス可能であり、コーディネータとすべてのパーティシパントに関するステータス情報を 出力し、次にトランザクションステータスメッセージを表示します。

2. トランザクションステータスが明白に決定できるが、コーディネータが アクセス不可能な場合は、ウォームリスタートユーティリティはパーティシパント上の ステータス情報とトランザクションステータスメッセージを表示します。
3. トランザクションステータスが明白に決定できない場合 （つまりパーティシパントが独立してステータスを判断できず、 コーディネータがアクセス不可能な場合）はこの状況に関する情報が 表示されます。

パーティシパントでのトランザクションは以下のいずれかの 方法で解決されます。

1. コミュニケーションが再び確立された場合にコーディネータ上でウォームリスタートユーティリティ を実行します。この方法を推奨します。
2. 以降で記述する問い合わせ言語`COMMIT WORK` または`ROLLBACK WORK` ((マニュアルでの操作 セクションを参照) を使用して、 パーティシパントでの操作を強制的にコミットまたはロールバックします。

   このマニュアルによる操作は慎重に行い、なおかつすべてのトランザクションに 関係する部分に対して行うことが必要です。

### 6.3.3 並列トランザクション

処理中の並列トランザクションで複数のデータベースが与えらた場合、 どのデータベースもあるトランザクションに関してはコーディネータになり、 他のトランザクションについてはパーティシパントになり得ます。

自動ウォームリスタートユーティリティは。そのデータベースが コーディネータであるトランザクションについてはデータベースをコーディネータとして 処理し、パーティシパントであるトランザクションについてはパーティシパントとして 処理します。自動ウォームリスタートユーティリティはデータベースに影響するすべての トランザクションを処理します。

## 6.4 トランザクションステータスの表示

問い合わせ言語の `DISPLAY WORK` コマンドは、 コーディネータおよび各パーティシパントのステータス情報、またトランザクションの すべてのステータスを含む、 トランザクションステータスの完全な詳細をリストするために使用することができます。

このサブセクションではこのコマンドの全般的な使用法について説明します。 コマンドの完全な構文は、 この章の トランザクションに関連した問い合わせ言語コマンド を記されています。

`DISPLAY WORK`コマンドは以下の3つの形式があります。

表 6-1: トランザクションステータスを表示するコマンド

コマンド | 説明
`DISPLAY WORK;` | カレントトランザクションのステータスを表示。
`DISPLAY WORK ON database [ALL];` | 対象データベースの関連する進行中のすべてのトランザクション（完了していないトランザクション） を表示。
`DISPLAY WORK [database:]id;` | 指定されたトランザクションステータスを表示。

       DISPLAY WORK;

このコマンドは、トランザクション中のみ使用できます。これにより、 カレントトランザクションのステータスが表示されます。

他の2つの形式は、処理中のトランザクションを識別し、 そのステータスを決定するために提供されます。 システム障害によって中断したトランザクションは、まだ"進行中"であると 見なされ。解決されることを待っている状態であり、完了するまでその状態が続きます。

       DISPLAY WORK ON database [ALL];

このコマンドは、 指定されたデータベースに関連するすべてのトランザクションの情報を出力します。 （`ALL`オプションが指定されない場合は情報の要約が出力され、 `ALL`オプションが指定された場合は完全な情報が出力されます。) システム障害後に入力された場合、データベースに影響のあるすべての未解決のトランザクションの リストを表示します。

       DISPLAY WORK [database:]id;

このコマンドは、トランザクションidの完全なステータス情報を出力します。 このidはトランザクションの識別コード（トランザクションID)で、 オプションとしてidの前にデータベース名を指定することができます。 データベースが指定されない場合は、デフォルトのデータベースが使用されます。 どのような場合においても このコマンドは、データベース上のトランザクションステータスを照会します。 トランザクションがデータベースに影響がない場合は、トランザクションID は、 識別コードが有効であっても認識されません。

`DISPLAY WORK` コマンドのサンプル出力フォームは、 この章の トランザクション例 に記述されます。 コマンドによって出力されるステータスメッセージの説明は、 トランザクションステータスメッセージ に記されます。

## 6.5 マニュアル操作

マニュアル操作は、以下の2つの状況のうちいずれかで行うことができます。

1. 自動ウォームリスタートユーティリティがトランザクションをロールバックすることによって、 トランザクション全体を失いたくない場合。

   トランザクションが、時間や労力をかけユーザーにとって価値のある場合、 トランザクション中にセーブポイントを設定するのが望ましく、 セーブポイントが設定されたトランザクションが中断した場合、 復旧のための代替の方法を取ることができます。 この場合、トランザクションステータスを検査し、 ウォームリスタートによってロールバックする代わりにセーブポイントまで トランザクションを復旧することができます。

2. パーティシパント上のトランザクションをすぐに解決する必要があり、 コーディネータとのコミュニケーションが確立できない場合。

   パーティシパント上でトランザクションを解決する必要であり、コーディネータとの コミュニケーションが確立できない場合、 そのパーティシパント上で強制的に解決することができます。 ほとんどの場合、パーティシパントでの `DISPLAY WORK`コマンドは正しい解決（コミットまたはロールバック） を通知します。

しかしながら、 複数のデータベースにわたるトランザクションが中断した場合、 パーティシパントはトランザクションをコミットするかロールバックするかどうかを 判断することができない場合があります。 これは、パーティシパントが、独自に処理の適切は方法が決定できない場合、 つまりコーディネータにアクセスできない場合を指します。 (コーディネータは常にトランザクションがコミットされるかロールバックされるかを 決定できます。） この場合、コミュニケーションが再確立されるまで待つかコーディネータのサイトの 誰かに問い合わせ `DISPLAY WORK` コマンドを使って正しい処理方法を決定してもらうことになります。

トランザクションを解決するために行う正しい処理が決定した場合は、 後に説明する `COMMIT WORK`あるいは`ROLLBACK WORK` コマンドを使用して パーティシパントのトランザクションをコミットまたはロールバックします。

パーティシパントでのトランザクションのコミットまたはロールバックを強制的に行った場合は、 パーティシパントのステータス情報はパーティシパントのデータベースから削除されます。 通常、パーティシパントは強制的な操作をコーディネータに報告しますが、 コーディネータにアクセスできない場合は、パーティシパントの最後の ステータスをコーディネータに知らせることはできません。 さらに、コミュニケーションが再確立できない場合、コーディネータは最終ステータスを 得ることができません。 コーディネータは、この状況をディスクの障害が発生したとして判断し、 自動ウォームアップリスタートユーティリティは何も処理を行いません。

コーディネータおよびすべてのほかのパーティシパントは トランザクションの強制的な解決を行うためにマニュアルによる操作を行う必要があります。 マニュアルによる操作では、データベースに対する一貫性は責任を持って行う必要があります。

マニュアル操作はトランザクションに関連したすべてのサイトに行い、慎重に行う必要があります。 マニュアル操作を不注意に行った場合、パーティシパントにおいて強制的にコミットまたは ロールバックが行われ、コーディネータや他のパーティシパントでの復旧処理と 矛盾することがあり得るます。それにより、一貫性のないデータがデータベースに残る可能性 があります。

## 6.6 セーブポイントまでの復旧

保護されていないトランザクションにおいて、 コミットコマンドが発行され、ログに記録される前に中断された場合、 自動ウォームリスタートユーティリティはトランザクションをロールバックします。 トランザクション全体の損失を避けるために、 Empressは、セーブポイントを使用して 部分的に完全なトランザクションを復旧する方法を行うことができます。 トランザクション中にセーブポイントが設定されることによって、 中断のあとどのセーブポイントへもトランザクションを復旧することができます。 トランザクションがセーブポイントまで復旧する場合、 次のウォームリスタートユーティリティの実行によって影響を受けません。

トランザクションが保護されていない場合、 セーブポイントへの復旧は、 ウォームアップユーティリティの実行前に終了しなければなりません。 トランザクションが保護されている場合は、 ウォームリスタートユーティリティは、セーブポイントまで復旧できるのであれば （保護を無効にする`-p`オプションが使用されていない場合) トランザクションを無視します。 従って、 セーブポイントへの復旧は、 ウォームリスタートユーティリティ実行後に行うことができます。

セーブポイントは以下のコマンドによってトランザクション中に設定されます。

       SAVEPOINT savepoint;

`savepoint`は、セーブポイントの名前で、数字ではなく文字で始まる文字列を指定します。

セーブポイントはまた、カレントトランザクション内のトランザクションのネストを 開始するためにも利用されます。 トランザクションのネストについての詳細な情報は Empress SQL: ユーザーズガイド および Empress SQL: リファレンス マニュアル を参照してください。

トランザクションは、以下のコマンドによってセーブポイントまで復旧されます。

       START WORK [database:]id [FROM savepoint];

`database`は､データベースの名前で、 データベースが指定されていない場合はデフォルトのデータベースが使用されます。

各トランザクションはID を持っています。 IDは`DISPLAY WORK`コマンドを使用して表示することができます。 詳細は、 トランザクション関連の問い合わせ言語コマンド を参照してください。 `savepoint`が指定されない場合は、トランザクションは最新のセーブポイント までを復旧します。

セーブポイントを設定していないトランザクションはこのコマンドでは復旧できないことに 注意してください。

トランザクション中ではない場合でもこのコマンドは使用できます。 適切なセーブポイントでトランザクションをリスタートし、それからトランザクションを続づける ことができます。

## 6.7 トランザクション保護

トランザクションを自動ウォームリスタートユーティリティから保護することができます。 システム変数`MSTRANSWARMPROTECT`は、 自動ウォームリスタートユーティリティ`empwarm` によってトランザクションを解決するかどうかを制御するフラグとして使用されます。

トランザクション開始時にこの変数に何かの値が設定されていた場合、 トランザクションは自動ウォームリスタートユーティリティから保護されます。 これは、`empwarm`ユーティリティは、 セーブポイントまで復旧が可能な場合はトランザクションを無視します。 この機能は、 自動ウォームリスタートが、システムの再起動処理の一部として含まれている場合に有効です。

コミットコマンドが発行されない場合、保護されていないトランザクションは 確実にロールバックされるため、 中断した長く保護されていないトランザクションはロールバックされる傾向にあります。 トランザクション保護により、 ウォームリスタート実行後に`START WORK FROM savepoint` コマンドを使用して、セーブポイントまで復旧することができます。

この変数はデフォルトでは設定されず、デフォルトでは、 ウォームリスタートユーティリティは、 すべての中断したトランザクションを解決します。 SQLセッション中で変数をするためには以下のように指定します。

       SET MSTRANSWARMPROTECT TO x;

## 6.8 トランザクションに関する問い合わせ言語コマンド

以下の問い合わせ言語コマンドはトランザクションの状態を制御し、検査します。

- `DISPLAY WORK`
- `START WORK`
- `COMMIT WORK`
- `ROLLBACK WORK`

問い合わせ言語で使用可能な様々なトランザクションに関するコマンドを以下に示します。 これらはトランザクションを実行するために使用されるコマンドとトランザクションを復旧 するために使用されるコマンドに分類されます。 ここでは、コマンドの完全な構文は説明していませんが、構文の詳細は後のページで説明します。

以下のコマンドは、トランザクションを開始し、カレントトランザクションを制御します。

表 6-2: トランザクション開始コマンド

コマンド | 説明
`START WORK;` | トランザクションを開始
`SAVEPOINT savepoint;` | セーブポイントを定義
`ROLLBACK WORK TO savepoint;` | セーブポイントまでロールバック
`DISPLAY WORK;` | カレントトランザクションのステータスを表示
`ROLLBACK WORK;` | トランザクションのロールバック
`COMMIT WORK;` | トランザクションのコミット (終了)

以下のコマンドはトランザクションを識別し、ステータスの表示、復旧および解決 するために使用されます。 トランザクション中ではない場合でのみ使用することができます。

表 6-3: トランザクション復旧コマンド

コマンド | 説明
`DISPLAY WORK ON database;` | 指定されたデータベースに関連した進行中（完了していない）すべてのトランザクションを表示
`DISPLAY WORK id;` | トランザクションステータスを表示
`START WORK id FROM savepoint;` | 指定されたセーブポイントまでロールバックすることで トランザクションを復旧します。
`ROLLBACK WORK id;` | トランザクションの強制ロールバック
`COMMIT WORK id;` | トランザクションの強制コミット

### 6.8.1 DISPLAY WORK

`DISPLAY WORK`コマンドの構文は以下になります。

|  |  | `DISPLAY` | `|WORK |TRANSACTION` | `| [ |` | `|ON |` | `|DB |database` | `| [ALL] |` | `|]; |`
|  |  |  |  |  | `| [` | `database:]id` |  | `|`

Note:

1. `database`はデータベース名です。データベース名が指定されていない場合は デフォルトのデータベースを使用します。 このコマンドはトランザクションのIDを決定するために使用されます。

2.      DISPLAY WORK;

   このコマンドをトランザクション処理中に入力し、トランザクションステータスを表示します。

   トランザクション処理中のみ使用可能で、トランザクション処理中に入力可能な唯一のコマンドです。

3.      DISPLAY WORK ON |DB      | [ALL];
                        |        |
                        |database|

   このコマンドは、現在、トランザクション中ではない場合にのみ入力可能です。

   `ALL`オプションを伴なうと、データベースに影響がある すべてのトランザクションの完全な詳細を表示します。

   `ALL`オプションが指定されない場合は、カレントデータベース (`DB`オプションにより) または`database`により 指定されたデータベースに関連する全てのトランザクションの要約された 情報が表示されます。

   要約情報には、トランザクションID、トランザクションについてのコメント、 トランザクションを実行中のユーザー名、トランザクションの日付、 トランザクションが保護されている場合はそのメッセージ、 トランザクションのコーディネータデータベースの情報が含まれています。

4.      DISPLAY WORK [database:]id;

   このコマンドは、`id`で指定されたトランザクションの 完全なステータス情報を表示します。

   このコマンドはトランザクション中ではない場合にのみ入力することができます。 ステートメント情報には、 トランザクションID、 トランザクションに関するコメント、 トランザクション日付、 トランザクションが保護されている場合はそのメッセージ、 トランザクションのコーディネータおよび各パーティシパント、 トランザクション内のセーブポイント、 トランザクション全体にわたるステータス評価が含まれています。

### 6.8.2 START WORK

`START WORK`コマンドは以下の構文になります。

|  |  | `START` | `|WORK |TRANSACTION` | `| [[database:]id [FROM savepoint]]; |`

Note:

1. `database`は、データベース名です。 データベース名が指定されていない場合は、カレントのデフォルトデータベースが 想定されます。 それぞれのトランザクションは、`DISPLAY WORK`コマンドを使用して決定された ID を持っています。 `savepoint`は、トランザクション中のセーブポイント名です。 これは数字以外の文字から始まる文字列でなければなりません。

2. このコマンドは、トランザクション中でない場合にのみ入力可能です。 システム障害によって中断されたトランザクションをセーブポイントまで 復旧し、操作を続けるためにトランザクションを再開します。 セーブポイントが指定されていない場合は、 最終（最新）定義のセーブポイントが利用されます。 セーブポイントを持たないトランザクションはセーブポイントまでの ロールバックをすることはできません。

3. このコマンドは、コーディネータ上で実行する必要があります。 これは、トランザクション識別子によってトランザクションのコーディネータが 指定しなくてはならないということです。

4. セーブポイントの設定は、 Empress SQL: リファレンス の`SAVEPOINT`コマンドで説明されています。

### 6.8.3 COMMIT WORK

`COMMIT WORK`コマンドの構文を以下に示します。

       COMMIT |WORK       | [database:] id;
              |TRANSACTION|

Note:

1. `database` は、データベース名です。 データベース名が指定されていない場合は、カレントのデフォルトデータベースが 想定されます。 それぞれのトランザクションは、`DISPLAY WORK`コマンドを使用して決定された ID を持っています。

2. このコマンドはトランザクション中ではない場合にのみ入力することができ、 指定されたトランザクションは強制的にコミットされます。 トランザクション中のすべての操作は、データベース内において永続化されます。

   コーディネータ上で実行する場合は、 コーディネータと全ての有効なパーティシパント に影響する操作がコミットされます。 パーティシパント上で実行される場合は、 そのパーティシパントと（可能な場合は）コーディネータに影響を 与える操作のみがコミットされます。

3. このコマンドは、`DISPLAY WORK`コマンドによって出力される 正しいトランザクションの解決方法に矛盾して使用することはできません。 例えば、正しい解決方法がトランザクションをロールバックすることであれば、 強制的な`COMMIT WORK`を試みても失敗します。 しかし、パーティシパントでトランザクションがコミットされるべきか ロールバックされるべきかを判断できない場合は注意が必要です。 このような場合は、正しくない解決方法がパーティシパントに強制的に行われる ことがあります。

   パーティシパントでの`DISPLAY WORK`が明確な解決を提供できない場合は コーディネータのサイトに問い合わせ、正しい処理が何であるのかを 判断する必要があります。

4. トランザクションをパーティシパントで強制的にコミットする場合は、 パーティシパントのステータス情報は、パーティシパントのデータベースから削除されます。

   コーディネータがアクセスできない場合、パーティシパントの最終ステータスを 知らされることはありません。 さらに、コミュニケーションが再確立されない場合は、コーディネータはパーティシパントの 最終ステータスを得ることはできません。 コーディネータはこの状態をディスク障害が発生した可能性があるものと判断し、 自動ウォームリスタートユーティリティは何も処理を行いません。 従って、コーディネータと他のすべてのパーティシパントでの解決を強制的に 行うためには、マニュアルによる操作で行う必要があります。 マニュアルによる操作は、 データベースが一貫性を保つようにマニュアル操作を行う者が責任を持ちます。

### 6.8.4 ROLLBACK WORK

`ROLLBACK WORK`コマンドの構文は以下になります。

       ROLLBACK |WORK       | [database:] id;
                |TRANSACTION|

Note:

1. `database` は、データベース名です。 データベース名が指定されていない場合は、カレントのデフォルトデータベースが 想定されます。 それぞれのトランザクションは、`DISPLAY WORK`コマンドを使用して決定された ID を持っています。

2. このコマンドはトランザクション中ではない場合にのみ入力することができ、 指定されたトランザクションは強制的にロールバックされます。 データベースに対してのトランザクション中のすべての操作は取り消されます。 コーディネータ上で実行する場合は、 コーディネータと全ての有効なパーティシパント に影響する操作がロールバックされます。 パーティシパント上で実行される場合は、 そのパーティシパントと（可能な場合は）コーディネータに影響を 与える操作のみがロールバックされます。

3. このコマンドは、`DISPLAY WORK`コマンドによって出力される 正しいトランザクションの解決方法に矛盾して使用することはできません。 例えば、正しい解決方法がトランザクションをコミットすることであれば、 強制的な`ROLLBACK WORK` を試みても失敗します。

   しかし、パーティシパントでトランザクションがコミットされるべきか ロールバックされるべきかを判断できない場合は注意が必要です。 このような場合は、正しくない解決方法がパーティシパントに強制的に行われる ことがあります。

   パーティシパントでの`DISPLAY WORK`が明確な解決を提供できない場合は コーディネータのサイトに問い合わせ、正しい処理が何であるのかを 判断する必要があります。

4. トランザクションをパーティシパントで強制的にロールバックする場合は、 パーティシパントのステータス情報は、パーティシパントのデータベースから削除されます。

   コーディネータがアクセスできない場合、パーティシパントの最終ステータスを 知らされることはありません。 さらに、コミュニケーションが再確立されない場合は、コーディネータはパーティシパントの 最終ステータスを得ることはできません。 コーディネータはこの状態をディスク障害が発生した可能性があるものと判断し、 自動ウォームリスタートユーティリティは何も処理を行いません。

   従って、コーディネータと他のすべてのパーティシパントでの解決を強制的に 行うためには、マニュアルによる操作で行う必要があります。 マニュアルによる操作は、 データベースが一貫性を保つようにマニュアル操作を行う者が責任を持ちます。

5. セーブポイントまでのロールバックについては Empress SQL: リファレンス マニュアル の`ROLLBACK WORK`コマンドを参照してください。

6. トランザクションをセーブポイントから再開するには`START WORK`を参照してください。

## 6.9 トランザクションステータスメッセージ

自動ウォームリスタートユーティリティが実行された場合、 または`DISPLAY WORK`コマンドが発行された場合、 各トランザクションのステータスは、検査され、 画面にメッセージを表示します。 ここで出力されるメッセージは、 次の2種類のメッセージが出力されます。 トランザクションに関係した個々のデータベースについてのメッセージ また、全体としてのトランザクションのステータスについてのメッセージ。

### 6.9.1 データベースステータスメッセージ

以下は、トランザクションに関係した個々のデータベースについての メッセージのリストになります。

`キャンセルされました`

  データベースのトランザクションはキャンセルされ、コミットはできません。 ステータス情報はデータベースから削除されています。

`コミットされました`

  データベースのトランザクションはコミットされ、ロールバックはできません。 ステータス情報はデータベースから削除されています。

`phase-1 コミット`

  トランザクションはデータベースでのコミットをするための準備がされています。 しかし、トランザクションはまだコミットまたはロールバックすることが可能でき、 ステータス情報はデータベースにまだ存在します。

`実行中`

  トランザクションは該当するデータベースで実行中です。 コミットあるいはロールバック命令は受け付けません。 スター手足す情報はデータベースにまだ存在します。 トランザクションはコミットできません。

`ステータスは無効です。`

  データベースはアクセスできません。原因として、ネットワーク障害、 ディスクがマウントされていない、データベースディレクトリを読み込むことができない ことが考えられます。 ユーザーがパーティシパント上に存在し、コーディネータが使用できない場合は、 トランザクションステータスを確認するためにコーディネータのサイトの誰かに 問い合わせする必要があります。

`ステータスの回復が不可能です。`

  ステータス情報がデータベースに欠如しています。この原因として以下のことが考えられます。

  - パーティシパントでの強制的なコミットまたはキャンセルが行われた場合 （これによってステータス情報がパーティシパントのデータベースから削除されます。）
  - 物理的なディスク障害
  - データベースのステータス情報のマニュアル操作での削除

  ステータスがコーディネータで復旧できない場合は、コーディネータサイト の誰かに 問い合わせ、トランザクション上行われる処理を判断する必要があります。 通常の状態では、トランザクションが全てのデータベースにおいて完全に解決されるまで ステータス情報はコーディネータに保存されます。

### 6.9.2 全体を通してのステータスメッセージ

以下は、全体を通してのトランザクションのステータスを 出力したメッセージのリストです。

`トランザクション取り消しの準備ができました。`

  トランザクションはロールバックする必要があります。 このメッセージがコーディネータで出力された場合は、 全てのサイトが持ち状態になり、ロールバック可能な状態です。 ウォームリスタートユーティリティ(コーディネータで実行) は、全てのサイトでトランザクションをロールバックします。

  このメッセージがパーティシパントで出力された場合は、パーティシパントでの トランザクションのステータスに対してのみ有効です。 コーディネータのセーブポイントまでロールバックできる可能性もあります。 それが可能かどうかを知るためにはコーディネータで `DISPLAY WORK`コマンドを実行する必要があります。

  このメッセージがパーティシパントで出力され、 コーディネータでウォームリスタートユーティリティか、 あるいは`DISPLAY WORK`コマンドを実行し、 パーティシパントはアクセス不可能であるとレポートする場合には、 コミュニケーションの再確立されたときにコーディネータの セーブポイントまでロールバックできる可能性がまだあります。

  パーティシパントで強制的にロールバックする場合は、 データは保護されますが、コーディネータへのロールバックの可能性を 失うことになります。

`全ての有効なデータベースに存在するトランザクションの取り消し準備ができました。`

  このメッセージはトランザクションのコーディネータでのみ出力されます。 トランザクションはロールバックする必要があり、コーディネータにアクセス可能な すべてのサイトはロールバック可能な状態にあります。 しかし、コーディネータにアクセスできないサイトが少なくとも１つはあります。 （ネットワーク障害、ファイルシステムがマウントされていない、 あるいはデータベースディレクトリが読み込みできないため） ウォームリスタートユーティリティはアクセス可能なすべてのサイトにおいて トランザクションをロールバックします。

  ウォームリスタートユーティリティを実行して、すべてのサイトでトランザクションを ロールバックすることができます。 コミュニケーションができないサイトで復元するために これらのサイトでトランザクションをロールバックするために ウォームリスタートユーティリティを繰り返し実行することがです。

  自動ウォームリスタートを実行する場合、ただ単に不適切な強制的処理がどの場所でも 行われないことを確認するためだけであるとしても、 現在、使用不可能なサイトの誰かにトランザクションステータスについて 知らせたいことがあるかもしれません。 今後、実行されるこのトランザクションへのウォームリスタートユーティリティ （または`DISPLAY WORK`コマンド）によって生成されるステータスレポートを チェックするべきです。 また、"警告"か"エラー"というメッセージが生成された場合は、 適切な処理を行う必要があります。

  すべてのパーティシパントがコーディネータにアクセス可能なときには セーブポイントへのロールバックが可能です。 コミュニケーションが再確立された場合にコーディネータで `DISPLAY WORK`コマンドを実行してください。

  現在、アクセス可能なサイトでトランザクションを解決する必要がある場合は、 パーティシパントで`ROLLBACK WORK`コマンドが使用できます。 パーティシパントにおぴて強制的ロールバックを行った場合は、 データは保護されますが、コーディネータにおいてセーブポイントへのロールバックの 可能性を失います。

`トランザクションコミットの準備ができました。`

  トランザクションはコミットする必要があります。 このメッセージがコーディネータで出力された場合は、 全てのサイトが持ち状態になり、ロールバック可能な状態です。 ウォームリスタートユーティリティ(コーディネータで実行) は、全てのサイトでトランザクションをロールバックします。

  このメッセージがパーティシパントで出力された場合は、パーティシパントでの トランザクションのステータスに対してのみ有効です。 全てのサイトにわたって全てのトランザクションステータスに決定するためには コーディネータで`DISPLAY WORK`コマンドを実行します。

  このメッセージがパーティシパントで出力され、 パーティシパントがコーディネータにアクセスできない場合は、 コーディネータで実行されるウォームリスタートがそのパーティシパントに 影響を与えることはありません。 コミュニケーションの再確立されたときにウォームリスタートユーティリティ が再実行された場合、パーティシパントでのトランザクションがコミットされます。 パーティシパントにおいて瞬時にトランザクションを解決する必要がある場合は、 パーティシパントで`COMMIT WORK` コマンドが使用できます。

`すべての有効なデータベースに存在するトランザクションのコミットができました。`

  このメッセージはトランザクションのコーディネータにおいてのみ表示されます。 トランザクションはコミットされるべきで、コーディネータにアクセス可能なすべての サイトがコミット可能な状態です。 しかし、コーディネータにアクセスできないサイトが少なくとも１つはあります。 （ネットワーク障害、ファイルシステムがマウントされていない、 あるいはデータベースディレクトリが読み込みできないため） ウォームリスタートユーティリティはアクセス可能なすべてのサイトにおいて トランザクションをコミットします。

  ウォームリスタートユーティリティを実行して、使用可能なサイトで トランザクションをコミットすることができます。 コミュニケーションができないサイトで復元するために これらのサイトでウォームリスタートユーティリティを再度させてそれらのサイトの トランザクションをコミットすることができます。

  現在、アクセス可能なサイトでトランザクションを解決する必要がある場合は、 パーティシパントで`COMMIT WORK`コマンドを使用することができます。

`トランザクションのリスタートまたはロールバックの準備ができました。`

  このメッセージは、トランザクションのコーディネータでのみ表示されます。 トランザクションの完全なロールバック、あるいはセーブポイントへのロールバック が可能です。 この場合、すべてのサイトがロールバック可能な状態にあります。 ここでウォー無理スタートユーティリティを実行するとトランザクションの完全 ロールバックが行われます。

  コーディネータで`START WORK`(セーブポイントから)コマンドを使用すれば、 セーブポイントまでのロールバックが可能ですが、セーブポイントまでの ロールバックを望む場合は、トランザクションの 完全ロールバックを引き起こすため、最初にコーディネータのウォームリスタートを 実行しないでください。この場合、セーブポイントまでロールバックしてから、 ウォームリスタートユーティリティを実行できます。 こうすれば、再スタートしたトランザクションは影響を受けません。

`コーディネータによりトランザクションステータスは無効です。`

  このメッセージはトランザクションのパーティシパントで ウォームリスタートユーティリティを実行するか、または `DISPLAY WORK`コマンドを実行した時にのみ実行されます。 パーティシパントはトランザクションがコミットするべきか、 ロールバックするべきかを明確に判断できず、 またコーディネータにアクセスして正しい処理を決定することができません。 そのため、ウォームリスタートユーティリティは何も処理をおこないません。

  コーディネータへのアクセスがすぐに復元される場合、 一旦、待って後でコーディネータでのウォームリスタートを実行できます。 すぐにパーティシパントのトランザクションを解決する必要がある場合は、 コーディネータサイトの責任者に問い合わせ、 `DISPLAY WORK`を実行してもらい、トランザクションに関する コーディネータのステータスレポートを取得します。 そうすることでコーディネータが示すように強制的にトランザクション を行うことができます。

`トランザクションは不明です。`

  このメッセージは`DISPLAY WORK`コマンドにより表示されます。 この場合、トランザクションのステータス情報が欠けているか、 あるいはトランザクションの識別子が間違って入力されいれていて、 ウォームリスタートユーティリティは何も処理を行いません。

  この場合、トランザクションの識別子（データベース名、トランザクションコード） をチェックしてください。それらが正しい場合はデータベースにおいて トランザクションのステータス情報が欠けています。 そのため、コーディネータでステータスを得るかまたは、アクセスできない場合は、 他のパーティシパントでステータスを取得してください。

  トランザクションがコーディネータで認識されてもパーティシパントで 認識されない場合、パーティシパントでステータス情報が欠けています。 そのため、コーディネータからのステータスレポートの命令に従ってください。 コーディネータがパーティシパントにアクセスできない場合は、 "警告"ステータスメッセージを参照してください。 コーディネータがトランザクションは中止される必要があると表示している 場合は、 メッセージ"警告：強制取り消しを行うとすべてのサイトに影響があります。" 以下を参照してください。 また、コーディネータがトランザクションはコミットすべきであると表示している 場合は、メッセージ"警告：強制コミットを行うとすべてのサイトに影響があります。" 以下を参照してください。 .

  トランザクションがパーティシパントで認識され、コーディネータで認識されない場合、コーディネータでステータス情報が欠如しています。 この場合、メッセージ"警告コーディネータデータベースの障害" 以下を参照してください。

`回復不能エラー、コーディネータと矛盾するパーティシパント`

  このメッセージは、トランザクションのコーディネータでのみ出力されます。 コーディネータと単一または複数のパーティシパントとの間に矛盾が生じています。 これは、以下のような場合になります。

  - コーディネータが必要なコミットを支持し、パーティシパントは強制ロールバックを 適用した場合、あるいは、
  - コーディネータが必要なロールバックを指示し、パーティシパントが強制コミットを 適用した場合。

  どちらの場合も、ウォームリスタートユーティリティは処理は何も行いません。

  ユーザーのデータは壊れています。この状況はパーティシパントが正しい 処理を明確に判断できず、（不正な）強制処理を今日日できなかった場合、 パーティシパントにおいてコミットまたはロールバックが強制的に行われた 結果生じます。 障害の生じたすべてのデータベースをアーカイブから復元するためには `emprecov`を使用する必要があります。

  こうした状況の発生を防ぐために、パーティシパントがトランザクションをコミット するかあるいはロールバックするか明確に判断できないときには常に コーディネータをチェックしてください。

`警告; コーディネータデータベースの障害`

  このメッセージはパーティシパント上でウォームリスタートユーティリティが 実行している場合か、あるいはパーティシパント上で `DISPLAY WORK`コマンドが実行されたときに表示されます。 コーディネータのステータス情報が、ディスク障害のために失われたか、 または手動により削除された状態で、ウォームリスタートユーティリティは、 これ以上の処理を行いません。

  コーディネータでトランザクションを強制せずに手動でステータス情報を 削除していない場合は、データが損傷しています。

  関係するすべてのデータベースをアーカイブから復元するためには `emprecov`を使用します。

`警告; すべてのサイトで強制取り消しによって起こる障害。`

  コーディネータはトランザクションを中止する必要があることを 指示していますが、ステータス情報はパーティシパントに見つかりません。 この場合、ロールバックでのみトランザクションを復旧できます。 ウォームリスタートユーティリティはこれ以上処理をおこないません。

  ステータス情報が欠如している原因には、ディスク障害（手動による削除も含む） か、あるいはパーティシパントでの強制的なコミットまたはロールバックが 考えられます。 パーティシパントで強制的なコミットまたはロールバックがおこなわれていない 場合は、ディスク障害によりデータが失われています。 この場合、関係するデータベースをアーカイブから復元するために `emprecov`を使用します。

  パーティシパントで強制的なコミットをおこなった場合は、データが損傷している ため、関係するすべてのデータベースをアーカイブから復元するために `emprecov`を使用します。 このような状況を避けるために、パーティパンとが トランザクションをコミットすべきかロールバックすべきか明確に 判断できない場合は、常にコーディネータでチェックしてください。

  パーティシパントで強制的なロールバックを行った場合は、 コーディネータならびに他のすべてのパーティシパントでトランザクションの 強制的なロールバックを行う必要があります。 これによりトランザクションが復旧されます。

`警告; すべてのサイトで強制コミットによって起こる障害。`

  コーディネータはトランザクションがコミットされる必要があることを 示していますが、ステータス情報はパーティシパントに見つかりません。 この場合、ステータス情報が欠如していること以外は、 全データに異常はありません。 ウォームリスタートユーティリティはこれ以上処理をおこないません。

  ステータス情報が欠如している原因には、ディスク障害（手動による削除も含む） か、あるいはパーティシパントでの強制的なコミットまたはロールバックが 考えられます。 パーティシパントで強制的なコミットまたはロールバックがおこなわれていない 場合は、 パーティシパントで`empclrlk`を実行するかまたはサーバーをリスタート する必要があります。 これにより、パーティシパントのすべてのロックがクリアされ、また同時に コーディネータならびに他のすべてのパーティシパントでトランザクションの 強制的なコミットを行う必要があります。 これによってトランザクションは復旧します。

  パーティシパントで強制的なコミットを行った場合は、 コーディネータならびに他のすべてのパーティシパントでトランザクションの 強制的なコミットを行う必要があります。 これによりトランザクションが復旧されます。

  パーティシパントで強制的なコミットが行われた場合は、データが破損しています。 これが起きる可能性があるものは以下のような場合です。

  - コーディネータが"committed"ステージに到達し、 パーティシパントが"committed phase-1" ステージに到達した場合
  - トランザクションがコミットするべきか、あるいはロールバックされるべきか を判断するためにパーティシパントはコーディネータにアクセスできない場合
  - パーティシパントで強制的なロールバックが行われた場合。 この場合、データが損傷しているため、`emprecov`を使用して 関係するすべてのデータベースをアーカイブから復元することが必要です。

  このような状況を避けるため、パーティシパントがトランザクションを コミットするべきか、あるいはロールバックされるべきか明確に判断できない場合、 常にコーディネータをチェックしてください。

## 6.10 トランザクション例

これらの例は、問い合わせ言語コマンドに関連したトランザクションと 自動ウォームリスタートユーティリティを示したものです。 例では、論理データベース名が使用され、データベースは すべて空の状態で始められます。

### 6.10.1 トランザクションの実行

トランザクションを開始するためには、 SQL セッション中に以下のコマンドを発行します。

       START WORK;

以下のように応答されます。

       トランザクションを開始

ここでのポイントは、どのようなクエリ言語コマンドでも 実行することができます。例えば以下のようなテーブル作成。

       CREATE db1: t(a);

これは、`db1`データベース中に`t`テーブルを作成します。 このテーブルは、デフォルトのデータタイプ`INTEGER`型の"`a`" いうアトリビュートを持っています。 トランザクションのこの状態のセーブポイントを設定するためには 以下のように入力します。

       SAVEPOINT sp1;

以下のように応答されます。

       セーブポイントを設定

データベース`db2`および`db3`中にテーブルを作成し、 以下のようにセーブポイントを設定します。

       CREATE db2: t(a);
       CREATE db3: t(a);
       SAVEPOINT sp2;

以下のように応答されます。

       Setting Save Point

このプロセスは好きなだけ繰り返すことができます。 例えば以下のように行います。

       CREATE db4: t(a);
       CREATE db5: t(a);
       SAVEPOINT sp3;

       Setting Save Point

       CREATE db6: t(a);
       CREATE db7: t(a);

### 6.10.2 カレントトランザクションの検査

ここまでのトランザクションのステータスを検査するために 以下のコマンドを実行します。

       DISPLAY WORK;
       トランザクション ID: 21359
       ユーザー: documentation
       日付: 29 Apr 1987  12:17:27
       コーディネータ DB:
       db1 -- 実行中

       パーティシパント DBs:
       db7 -- 実行中
       db6 -- 実行中
       db5 -- 実行中
       db4 -- 実行中
       db3 -- 実行中
       db2 -- 実行中

       セーブポイント:
       sp1
       sp2
       sp3

この出力は、トランザクションのコーディネータが`db1` であることを表示します。 （トランザクション中に最初にアクセスされたデータベース） また、パーティシパントのリストを表示します。 各データベースのステータスは"`実行中`"であり、 3つのセーブポイントの定義があります。

### 6.10.3 トランザクションへの割り込み

トランザクションは`quit` シグナルによって割り込みを受け付けつけます。 (適切なキーシケンスはUNIX の`stty all`コマンドによって表示されます。) `quit`シグナルは、トランザクションのシャットダウンを制御し、 ロールバックを始めます。

### 6.10.4 トランザクションの検査

`empsql`を再スタートしたときにカレントトランザクションが全くない場合、

       DISPLAY WORK;

は以下のように出力します。

       *** User Error *** 進行中のトランザクションはありません。

データベース`db1`上の実行中のトランザクションを見つける場合、 以下のコマンドを発行します。

       DISPLAY WORK ON db1;

このコマンドの結果として

       トランザクション ID: 21359
       ユーザー: documentation
       日付: 29 Apr 1987  12:17:27
       コーディネータ DB:
       db1 -- 実行中

同じトランザクションが、データベース`db2`への問い合わせで 以下のように表示されます。

       DISPLAY WORK ON db2;

       トランザクション ID: 21359
       ユーザー: documentation
       日付: 29 Apr 1987  12:17:27
       コーディネータ DB:

       db1 -- 実行中

`DISPLAY WORK`コマンドからの トランザクションの完全な情報は以下のように出力されます。

       DISPLAY WORK db1:21359;

       トランザクションの状況を決定しています。
       トランザクション ID: 21359
       ユーザー: documentation
       日付: 29 Apr 1987  12:17:27
       コーディネータ DB:

       db1 -- 実行中

       パーティシパント DBs:
       db7 -- 実行中
       db6 -- 実行中
       db5 -- 実行中
       db4 -- 実行中
       db3 -- 実行中
       db2 -- 実行中

       セーブポイント:
       sp1
       sp2
       sp3

       トランザクションのリスタートまたはロールバックの準備ができました。

このステータスレポートは、割り込み直前にトランザクションに対して、 表示されるステータスレポートと同一です。しかし、各データベースに 関するステータスメッセージに加え、トランザクション全体に関する ステータスメッセージが含まれ、このメッセージを出力させることが 最も一般的です。

このステータスレポートはトランザクションに対して、コーディネータから 出力されます。 コーディネータはすべてのパーティシパントをポールし、そのステータスを 決定します。 トランザクション中はコミットまたはロールバックコマンドが発行されないため、 トランザクションはすべてのデータベース内で"実行中"の状態であり、ロールバック が可能です。 トランザクション内でセーブポイント定義があり、そのセーブポイントから リスタートすることも可能です。

パーティシパント上に照会を行うと以下のように表示されます。

       DISPLAY WORK db2:21359;

       トランザクションの状況を決定しています。
       トランザクション ID: 21359
       ユーザー: documentation
       日付: 29 Apr 1987  12:17:27

       コーディネータ DB:

       db1 -- 実行中

       パーティシパント DBs:

       db7 -- ステータスが決定されていません。
       db6 -- ステータスが決定されていません。
       db5 -- ステータスが決定されていません。
       db4 -- ステータスが決定されていません。
       db3 -- ステータスが決定されていません。
       db2 -- 実行中

       セーブポイント:
       sp1
       sp2
       sp3

       トランザクションの取り消しの準備ができました。

この場合、パーティシパントがコーディネータをポールし、そのステータス、 パーティシパントのリストならびに定義されたセーブポイントを知ることができます。 これ以外のパーティシパントはポールされないため、決定されません。

### 6.10.5 使用不可能なパーティシパント

データベースはオペレーティングシステムのパーミッションを削除することによって アクセスできないようにすることができます。 Empressの"`!`"コマンドを使用することで、 SQL セッションからオペレーティングシステムコマンドを実行できます。

       !chmod 0 db4;

`DISPLAY WORK`の表示は、以下のようになります。

       DISPLAY WORK db1:21359;

       トランザクションの状態を決定しています
       トランザクション ID: 21359
       ユーザー: documentation
       データ: 29 Apr 1987  12:17:27
       コーディネータ DB:

       db1 -- 実行中

       パーティシパント DBs:

       db7 -- 実行中
       db6 -- 実行中
       db5 -- 実行中
       db4 -- ステータスは無効です
       db3 -- 実行中
       db2 -- 実行中

       セーブポイント:
       sp1
       sp2
       sp3

       全ての有効なデータベースに存在するトランザクションの取り消し準備ができました。

現在の`db4`のステータスは無効で、 さらにコーディネータはトランザクションが セーブポイントからリスタートすることが可能か どうか判断できない状態です。

### 6.10.6 使用不可能なコーディネータ

コーディネータ`db1` は、以下のようにアクセスできないようにします。

       !chmod 0 db1;

パーティシパント上で`DISPLAY WORK`コマンドを実行すると 以下のように表示されます。

       DISPLAY WORK db2:21359;

       トランザクションの状況を決定しています
       トランザクション ID: 21359
       ユーザー: documentation
       日付: 29 Apr 1987  12:17:27
       コーディネータ DB:

       db1 -- ステータスは無効です

       パーティシパント DBs:

       db2 -- 実行中

       トランザクション取り消しの準備が出来ました。

パーティシパントがコーディネータにアクセスできないため、 そのステータスを知ることができません。その同じ理由で、 他のパーティシパント名および定義されたセーブポイントの存在 についても知ることは出来ません。

### 6.10.7 パーティシパント上でのウォームリスタート

ウォームリスタートを実行する前にコーディネータを再度アクセス可能にします。

       !chmod 755 db1;

パーティシパント上で冗長モードでウォームリスタートユーティリティを 実行した結果は以下のようになります。

       !empwarm -v db2;

       ユーザー: documentation
       日付: 29 Apr 1987  12:17:27
       コーディネータ DB:

       db1 -- 実行中

       パーティシパント DBs:

       db7 -- ステータスは決定されていません
       db6 -- ステータスは決定されていません
       db5 -- ステータスは決定されていません
       db4 -- ステータスは決定されていません
       db3 -- ステータスは決定されていません
       db2 -- 実行中

       セーブポイント:
       sp1
       sp2
       sp3

       トランザクション取り消しの準備ができました。

       これはパーティシパントのデータベースです。

       コーディネータのデータベースは db1 です。
       進行なし。

パーティシパント上で実行されている場合は、 ウォームリスタートによる処理は全く行われません。 ウォームリスタートユーティリティは、 `DISPLAY WORK`コマンドによって表示される情報と 同一のステータス情報を出力します。

### 6.10.8 コーディネータのウォームリスタート

トランザクションのコーディネータ上で 冗長モードによるウォームリスタートを実行すると 以下のようになります。

       !empwarm -v db1

       トランザクション ID: 21359
       ユーザー: documentation
       日付: 29 Apr 1987  12:17:27
       コーディネータ DB:

       db1 -- 実行中

       パーティシパント DBs:

       db7 -- 実行中
       db6 -- 実行中
       db5 -- 実行中
       db4 -- ステータスは無効です
       db3 -- 実行中
       db2 -- 実行中

       セーブポイント:
       sp1
       sp
       sp3

       全ての有効なデータベースに存在するトランザクションの取り消し準備が出来ました。

       トランザクションを取り消します。

リスタート後にコーディネータのトランザクションの問い合わせは以下のように 表示します。

       DISPLAY WORK db1:21359;

       トランザクションの状況を決定しています。

       トランザクション ID: 21359
       ユーザー: documentation

       日付: 29 Apr 1987  12:17:27

       コーディネータ DB:

       db1 -- キャンセルされました

       パーティシパント DBs:
       db7 -- キャンセルされました
       db6 -- キャンセルされました
       db5 -- キャンセルされました
       db4 -- ステータスは無効です
       db3 -- キャンセルされました
       db2 -- キャンセルされました

       全ての有効なデータベースに存在するトランザクションの取り消し準備が出来ました。

トランザクションが中止されているパーティシパント`db2`への 問い合わせでは次のように表示されます。

       DISPLAY WORK db2:21359;

       *** User Error *** トランザクション 21359  は無効です。

トランザクションはこのパーティシパントでは解決されているため、 パーティシパントはステータス情報を削除し、これ以上トランザクションに関与しません。

`db1`をアクセスできないようにし、`db4`を可能にした場合、 `db4`のトランザクションについて照会を行います。

       !chmod 755 db4;
       !chmod 0 db1;

       DISPLAY WORK db4:21359;

       トランザクションの状況を決定しています。
       トランザクション ID: 21359
       ユーザー: documentation
       日付: 29 Apr 1987  12:17:27
       コーディネータ DB:

       db1 -- ステータスは無効です

       パーティシパント DBs:

       db4 -- 実行中

       トランザクションを取り消し準備ができました。

このトランザクションは、これまでに見て行ったきたものと 一致する`db4`の取り消しするための準備です。

### 6.10.9 強制的なロールバック

`db4`上で強制的なロールバックが可能です。 (強制的なロールバックはコーディネータとのコミュニケーションが可能な場合には、 勧められません。) この結果は、

       ROLLBACK WORK db4:21359

       トランザクションの状況を決定します。

       トランザクションを取り消します。

       *** Warning *** コーディネータが不足なため、
       パーティ子パントステータスが失われます。

コーディネータが利用できないため、パーティ子パントはトランザクションを中止すること をコーディネータに通知することができません。 `db4`からのトランザクションに関するすべてのステータス情報も、 強制的なロールバックによって削除されます。 `db4`のトランザクションについての問い合わせは以下のように表示されます。

       DISPLAY WORK db4:21359;

       Unknown Transaction 21359

コーディネータを利用できるようにしてから、照会をおこなうと以下のように表示します。

       !chmod 755 db1

       DISPLAY WORK db1:21359;

       トランザクションの状況を決定しています。
       トランザクション ID: 21359
       ユーザー: documentation
       日付: 29 Apr 1987  12:17:27
       コーディネータ DB:

       db1 -- キャンセルされました

       パーティシパント DBs:

       db7 -- キャンセルされました
       db6 -- キャンセルされました
       db5 -- キャンセルされました
       db4 -- ステータスは無効です
       db3 -- キャンセルされました
       db2 -- キャンセルされました

       警告; 警告; 矛盾している可能性があり、すべてのサイトで強制的なキャンセルを行ってください。

`db4`のトランザクションステータスは"復元不可能"を意味します。 コーディネータは、`db4`のトランザクションがキャンセルの準備がされている ことがわからない状態です。

ウォームリスタートユーティリティは、同じ状況をレポートします。

       !empwarm -v db1

       トランザクション ID: 21359
       ユーザー: documentation
       日付: 29 Apr 1987  12:17:27

       コーディネータ DB:

       db1 -- キャンセルされました

       パーティシパント DBs:

       db7 -- キャンセルされました
       db6 -- キャンセルされました
       db5 -- キャンセルされました
       db4 -- ステータスは無効です。
       db3 -- キャンセルされました
       db2 -- キャンセルされました

       警告; 矛盾している可能性があり、すべてのサイトで強制的なキャンセルを行ってください。

          何も処理しません。

トランザクションを解決する唯一の方法は、コーディネータで 強制的に中止することです。

       ROLLBACK WORK db1:21359

       トランザクションステータスを決定しています。

       トランザクションを取り消します。

トランザクションが解決されたことを確かめるには

       DISPLAY WORK ON db1;
       トランザクションはありません。

トランザクション 21359 は解決され、すべてのステータス情報が削除されました。