# CHAPTER 6: データ制御コマンド

## 6.1 はじめに

データ制御言語 (DCL) コマンドはデータ保全およびセキュリティも ために提供されます。利用可能なDCLコマンドの要約を以下に示します。

Table 6-1: データ制御言語コマンド

コマンド | 概要
`START WORK` | `COMMIT WORK`または`ROLLBACK`コマンド発行されるまで、 データベースには反映されない1セットのコマンドを実行します。
`COMMIT WORK` | トランザクション中に行なわれたデータベースへの変更を確定します。
`ROLLBACK` | トランザクション中に行なわれたデータベースへの変更を無効にします。
`SAVEPOINT` | トランザクション中に行なわれた変更を確定するポイントを設定します。 `ROLLBACK`コマンドによって、ポイントまで回復することができます。
`DISPLAY WORK` | 現在のトランザクション状況を表示します。

## 6.2 START WORK

`START WORK`コマンドはトランザクションという一連のコマンドの実行を 開始します。トランザクション中はデータベースへの変更は一時的であり、 トランザクションの終了時に変更の確定または取り消しが行なわれます。

ディスク、オペレーティングシステム、ネットワークなどに障害が発生した場合、 トランザクションはウォームリスタート機能により、トランザクションの確定または 取り消し処理が行なわれます。この機能によりトランザクションに関連したデータの 整合性が保証されます。ウォームリスタート機能については、 Empress: Database Administrator's Guide を参照してください。

トランザクションの一般的な概要については、 Empress SQL: ユーザーズガイドを参照してください。

Syntax

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

  説明

  `database` | データベース名。
  `savepoint` | トランザクション中のセーブポイント名です。英字で始まる必要があります。
  `id` | トランザクションID。

注意

1. コマンド

          START WORK;

   は、トランザクションを開始します。 すでにトランザクションが開始されていた場合、トランザクションは既に開始されて いる旨のメッセージが表示されます。

2. コマンド

          START WORK database:id FROM savepoint;

   は、システム障害によって中断されたトランザクションを回復するために使用され ます。トランザクションを続行できるように再開して、現在のユーザの環境内で指定 されたセーブポイントからの指定された処理を回復します。 セーブポイントが指定されない場合、最後に定義されたセーブポイントが使用されます。 セーブポイントのないトランザクションはセーブポイントへのロールバックはできま せん。トランザクションIDおよびセーブポイントの名前は`DISPLAY WORK` コマンドで取得できます。

3. セーブポイントは`SAVEPOINT`コマンドによってトランザクション中に設定 できます。(ネストされたトランザクションの開始)

4. トランザクションはコミットまたはロールバックすることができます。コミット する場合はネストされたトランザクションも含め全てのトランザクションを一度に コミットします。ロールバックはセーブポイントごとに実行することが可能です。 コミットには`COMMIT WORK`コマンド、ロールバックには `ROLLBACK WORK`コマンドを使用します。

5. システム変数`MSTRANSCOMMENT`を使用すると、トランザクションに コメントを作成することができます。トランザクションの開始時に、この変数が設定 されていればトランザクションのコメントとして使用されます。コメントは引用符で 囲み、最大64文字まで設定できます。

6. システム変数`MSTRANSWARMPROTECT`を使用すると、ウォームリスタート ユーティリティ`empwarm`から、トランザクションを保護することができます。 トランザクションが中断された場合、ウォームリスタートによりセーブポイントまで トランザクションを回復することができますが、トランザクションの開始時にこの変数 が有効である場合には、ウォームリスタートが機能しません。

7. データベース名が指定されない場合、現在のデータベースが選択されます。 各トランザクションはIDを持ち、`DISPLAY WORK`コマンドを使用して表示する ことができます。

8. このコマンドは、コーディネータ（トランザクションで最初にアクセスされる データベース）で実行しなくてはなりません。トランザクションの識別には、 コーディネータを指定しなくてはなりません。

9. セーブポイントの設定については、`SAVEPOINT`コマンドの章で解説します。

必要な特権

  なし

例

1. トランザクションの開始

   トランザクションを開始し、データを`personnel`テーブルに挿入し、 変更を確定します。

          START WORK;

   以下のメッセージを出力します。

          Starting Transaction

   レコードを挿入し検索します。

          INSERT personnel SET TO 20, 'Martin', '862-1250', 500;
          SELECT * FROM personnel;

   以下のように表示されます。

          number     name          phone             credit_limit

          10         Kilroy        426-9681          $500.00
          5          Mosca         544-2243          $750.00
          17         Wladislaw     723-6073          $200.00
          3          Jones         667-2951          $500.00
          8          Peterson      978-6060          $250.00
          4          Scarlatti     961-7363          $100.00
          20         Martin        862-1250          $500.00

   トランザクションをコミットします。

          COMMIT WORK;

   以下のメッセージを出力します。

          Committing Transaction

2. ネストされたトランザクション

   トランザクションを開始し、セーブポイントを設定した後にセーブポイントまで ロールバックし、最後にコミットします。

          * START WORK;
          Starting Transaction
       	   .
       	   .
       	   .

          * SAVEPOINT sp1;
          Setting Save Point
       	   .
       	   .
       	   .

          * ROLLBACK WORK TO sp1;
          Rolling Back to Save Point

          * COMMIT WORK;
          Committing Transaction

## 6.3 COMMIT WORK

`COMMIT WORK`コマンドは、カレントトランザクションにおけるデータベース への変更を確定し、トランザクションを終了します。トランザクションは `START WORK`コマンドで開始します。

Syntax

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

  説明

  `database` | データベース名。
  `id` | トランザクションID。

注意

1. コマンド

          COMMIT WORK;

   は、トランザクション中に使用され、トランザクションを確定します （全ての変更を反映します)。トランザクションが開始されていない場合には、 エラーメッセージを表示します。

   トランザクションは部分的にコミットできません。ネストされた全ての トランザクションがコミットされます。

2. コマンド

          COMMIT WORK database:id;

   は、指定されたトランザクションを強制的にコミットします。カレントの トランザクションでないものに対してのみ発行できます。トランザクションでの全ての 変更が確定されます。コーディネータ（最初にアクセスされるデータベース）で実行 した場合、コーディネータと全てのパーティシパント（その他のデータベース）に 影響するトランザクションがコミットされます。パーティシパントで実行した場合には、 コーディネータと現在のパーティシパントに影響するトランザクションのみコミット されます。

3. データベース名を指定しない場合、現在のデータベースが使用されます。 各トランザクションにはIDがあり、`DISPLAY WORK`コマンドで表示できます。

4. `DISPLAY WORK`コマンドで表示される、適切なトランザクションに反した コマンドは実行することはできません。適切なトランザクションがロールバックである 場合に、強制的なコミットは正常に実行されません。 パーティシパントがトランザクションのコミットかロールバックのどちらを実行するか わからない場合には注意する必要があります。パーティシパントにおいて不適切な トランザクションが強制されている場合もあります。 `DISPLAY WORK`コマンドで明確に適切なトランザクションを確定できない場合 には、コーディネータに移り適切なトランザクションを確認します。

5. パーティシパントにおいて、トランザクションを強制的にコミットすると、 ステータス情報がパーティシパントデータベースから削除されます。 この時コーディネータにアクセスできない場合には、コーディネータに対して ステータス情報は連絡されません。通信が再開された場合でもステータス情報は連絡 されません。コーディネータはこの場合、ディスク障害が発生したと解釈し、 ウォームリスタートしても処理してくれません。 従って、コーディネータと全パーティシパントにおいて、トランザクション処理を コミットするには、ユーザが自ら行なう必要がありますので、全データベースで ユーザの指定が統一されているか注意してください。

6. トランザクションについては、 Empress SQL: ユーザーズガイドで解説します。

   システム障害からのトランザクションの復元についてはEmpress: Database Administrator's Guideの ウォームリスタートを参照してください。

必要な特権

  なし

例

  トランザクションを開始し、レコードを変更後にコミットします。

         * START WORK;
         Starting Transaction

         * UPDATE personnel
              SET phone TO '426-6981'
              WHERE name = 'Mosca';

         * SELECT * FROM personnel;

         number     name          phone          credit_limit

         3          Jones         667-2951       $750.00
         4          Scarlatti     961-7363       $100.00
         5          Mosca         426-6981       $750.00
         8          Peterson      978-6060       $250.00
         9          Jordan        964-3335       $250.00
         17         Wladislaw     811-5110        $10.00

         * COMMIT WORK;
         Committing Transaction

## 6.4 ROLLBACK WORK

`ROLLBACK WORK`コマンドは、カレントトランザクションで処理した全ての コマンドを取り消し、トランザクションを開始する前の状態にデータベースを復元 します。トランザクションは`START WORK`コマンドで開始します。

Syntax

  `|ROLLBACK |CANCEL` | `| [ |` | `|WORK |TRANSACTION` | `|] [ |` | `|TO savepoint |[database:]id` | `|]; |`

  説明

  `savepoint` | トランザクション中のセーブポイント名。英字で始まる文字列です。
  `database` | データベース名。
  `id` | トランザクションID。

注意

1. コマンド

          ROLLBACK WORK TO savepoint;

   は、トランザクションをロールバックします。セーブポイントを指定した場合、 トランザクションは指定セーブポイントまでロールバックされますが、 トランザクションは終了しません。セーブポイントの設定は`SAVEPOINT` コマンドで行なっておかなくてはなりません。セーブポイントを指定しない場合には、 トランザクション全体がロールバックします。トランザクション中の全処理が取り消 され、トランザクションは終了されます。

2. コマンド

          ROLLBACK WORK database:id;

   は、指定したトランザクションIDを持つトランザクションを強制的にロールバック します。カレントのトランザクションでないものに対してのみ発行できます。 データベースに対する全ての操作は取り消されます。 コーディネータ（最初にアクセスされるデータベース）で実行した場合、 コーディネータと全パーティシパント（その他のデータベース）に関わる トランザクションは取り消されます。パーティシパントで実行した場合には、 コーディネータとそのパーティシパントに関わるトランザクションのみ取り消されます。

3. トランザクションは処理中でなければ、このコマンドは無効となります。 この時Empressはトランザクションが処理していない旨のメッセージを表示 します。

4. データベース名を指定しない場合、カレントのデータベースが使用されます。 各トランザクションはIDを持ち、`DISPLAY WORK`コマンドで取得できます。

5. `DISPLAY WORK`コマンドで表示されるトランザクションの適切な処理に 反して、このコマンドを実行することはできません。例えば適切な処理がコミットで ある場合、強制的な`ROLLBACK WORK`コマンドは正常に実行できません。 パーティシパントがトランザクションのコミットかロールバックのどちらを実行するか わからない場合には注意する必要があります。パーティシパントにおいて不適切な トランザクションが強制されている場合もあります。`DISPLAY WORK`コマンド で明確に適切なトランザクションを確定できない場合には、コーディネータに移り 適切なトランザクションを確認します。

6. パーティシパントにおいて、トランザクションを強制的にコミットすると、 ステータス情報がパーティシパントデータベースから削除されます。 この時コーディネータにアクセスできない場合には、コーディネータに対して ステータス情報は連絡されません。通信が再開された場合でもステータス情報は連絡 されません。コーディネータはこの場合、ディスク障害が発生したと解釈し、 ウォームリスタートしても処理してくれません。 従って、コーディネータと全パーティシパントにおいて、トランザクション処理を コミットするには、ユーザが自ら行なう必要がありますので、全データベースでユーザ の指定が統一されているか注意してください。

7. 中断されたトランザクションをセーブポイントから再開する方法は、 `START WORK`コマンドの章を参照してください。

8. トランザクションに関する一般的な解説は、 Empress SQL: User's Guideを参照してください。

9. システム障害からのトランザクションの復元については、Empress: Database Administrator's Guideの ウォームリスタートを参照してください。

必要な特権

  なし

例

1. トランザクションの取り消し

   以下の操作で`personnel`テーブルに行なった2つの更新を、 `ROLLBACK`コマンドを使用して取り消します。

          * START WORK;
          Starting Transaction

          * SELECT * FROM personnel;

          number     name            phone             credit_limit

          3          Jones           667-2951          $750.00
          4          Scarlatti       961-7363          $100.00
          5          Mosca           426-9681          $750.00
          8          Peterson        978-6060          $250.00
          9          Jordan          964-3335          $250.00
          10         Kilroy          426-9681          $500.00
          17         Wladislaw       811-5110           $10.00

          * UPDATE personnel
               SET phone TO '426-6981';

          * UPDATE personnel
               SET credit_limit to 250
               WHERE name = 'Mosca';

          * SELECT * FROM personnel;

          number     name            phone              credit_limit

          3           Jones          426-6981           $750.00
          4           Scarlatti      426-6981           $100.00
          5           Mosca          426-6981           $250.00
          8           Peterson       426-6981           $250.00
          9           Jordan         426-6981           $250.00
          10          Kilroy         426-6981           $500.00
          17          Wladislaw      426-6981            $10.00

          * ROLLBACK WORK;
          Cancelling Transaction

          * SELECT * FROM personnel;

          number     name            phone              credit_limit

           3          Jones          667-2951           $750.00
           4          Scarlatti      961-7363           $100.00
           5          Mosca          426-9681           $750.00
           8          Peterson       978-6060           $250.00
           9          Jordan         964-3335           $250.00
          10          Kilroy         426-9681           $500.00
          17          Wladislaw      811-5110            $10.00

2. セーブポイントまでのロールバック

   次のコマンドでトランザクションを開始し、セーブポイントを設定した後に、 セーブポイントまでロールバックしセーブポイントまでの処理はコミットします。

          * START WORK;
          	.
          	.
          	.

          * SAVEPOINT sp1;
          	.
          	.
          	.

          * ROLLBACK WORK TO sp1;
          Rolling Back to Save Point

          * COMMIT WORK;
          Committing Transaction

## 6.5 SAVEPOINT

`SAVEPOINT`コマンドは、トランザクション中にセーブポイントを設定 します。このコマンドはトランザクションの中でないと有効ではありません。

Syntax

      SAVEPOINT savepoint;

  説明

  `savepoint` | ユーザにより与えられたセーブポイント名。英字で始まる文字列です。

注意

1. このコマンドはトランザクション中にセーブポイントを設定します。すなわち ネストされたトランザクションとなります。

2. トランザクションはコミットまたはロールバックできます。コミットした場合、 ネストされたトランザクションを含め全体がコミットされます。ロールバックは設定 されたセーブポイントまでの部分的なロールバックも実行できます。

3. 中断されたトランザクションは、セーブポイントから再開することができます。 `START WORK`コマンドを参照してください。

4. トランザクションの一般的な解説は Empress SQL: ユーザーズガイドを参照してください。

5. 管理用トランザクション制御コマンドについては、Empress: Database Administrator's Guideの中の ウォームリスタートを参照してください。

必要な特権

  なし

例

  次のコマンドでトランザクションを開始し、セーブポイントを設定したのち、 セーブポイントまでロールバック後にセーブポイントまでのトランザクションを コミットします。

         * START WORK;
           .
           .
           .

         * SAVEPOINT sp1;
           .
           .
           .

         * ROLLBACK WORK TO sp1;
         Rolling Back to Save Point

         * COMMIT WORK;
         Committing Transaction

## 6.6 DISPLAY WORK

`DISPLAY WORK`コマンドは、トランザクションについてのステータス情報を 表示します。ID、コメント、トランザクションを開始したユーザ名、トランザクション の日付、トランザクション保護されている旨のメッセージ、コーディネータと パーティシパント、セーブポイント、トランザクションの全面的なステータス評価を 表示します。

Syntax

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

  説明

  `id` | トランザクションID。

注意

1. コマンド

          DISPLAY WORK;

   は、トランザクションの中で発行できます。カレントトランザクションの状況を 表示します。

2. `DISPLAY WORK`コマンドはトランザクションの外部でのみ使用できます。 `ALL`オプションを指定しない場合、カレントデータベースまたは指定した データベースに関連した、全てのトランザクションの要約情報が表示されます。 要約情報にはID、コメント、開始したユーザ名、開始日付、トランザクション保護 されている旨のメッセージ、コーディネータなどが表示されます。 `ALL`オプションが指定されるとデータベースに関する全てのトランザクション の詳細情報が表示されます。

3. 自動ウォームリスタートユーティリティが実行される場合、または `DISPLAY WORK`コマンドが発行されると各処理のステータス、または メッセージは画面上に表示されます。以下にメッセージを示します。

ステータスメッセージ

- `cancelled`

  トランザクションはキャンセルされました。確定された処理はなく、 トランザクション情報は削除されました。

- `committed`

  トランザクションは確定されました。ロールバックすることはできなく、 トランザクション情報は削除されました。

- `committed phase-1`

  トランザクションを確定する準備ができました。しかしこの状態ではコミットも ロールバックも可能です。ステータス情報はデータベースの中にあります。

- `in progress`

  トランザクションはデータベースに対して進行中（続行中）です。コミットまたは ロールバックの指示は受け付けません。ステータス情報はデータベースの中にあります。 トランザクションはコミットできません。

- `status unavailable`

  データベースにはアクセスできません。原因として考えられるにのは、 ネットワーク障害、ディスクのマウントエラー、データベースディレクトリの読み取り 不可能などです。ユーザがパーティシパントで、コーディネータにアクセスできない 場合には、コーディネータのユーザに連絡し、トランザクションのステータスを確認 する必要があります。

- `status unrecoverable`

  ステータス情報がデータベースに存在しない場合、これは以下のいずれかの理由に よります。

  - パーティシパントでの強制的なコミットまたはロールバック
  - データベースのあるディスクの物理的な障害
  - データベースにあるステータス情報の手動削除

  コーディネータによるステータス情報の復元ができない場合には、コーディネータ のユーザに連絡し、トランザクションはどのような処理が実行されたか確認する必要が あります。一般的に全データベースでトランザクションが完了していない限り、 ステータス情報はコーディネータに残されているはずです。

全体的なステータスメッセージ (トランザクション単位)

- `Transaction ready for cancel`

  トランザクションをロールバックします。コーディネータで表示されている場合 には、全サイトがチェックされ準備が整えられます。ウォームリスタート ユーティリティ（コーディネータで実行）は、全サイトでトランザクションを ロールバックします。

  このメッセージがパーティシパントで表示された場合、これはパーティシパントの トランザクションのステータスを表示します。またコーディネータでのセーブポイント へのロールバックでの可能性もあります。コーディネータで`DISPLAY WORK` コマンドを実行してチェックしてください。

  パーティシパントのメッセージに対処して、コーディネータではウォームリスタート ユーティリティまたは`DISPLAY WORK`コマンドを実行します。 この時パーティシパントにアクセスできない旨のメッセージが表示されても、通信が 再接続されればコーディネータのセーブポイントにロールバックできる可能性は残され ます。

  パーティシパントで強制的なロールバックを行なうと、パーティシパントのデータ は保全されます。しかし、コーディネータのセーブポイントへのロールバックは不可能 となります。

- `Transaction ready for cancel on all available databases`

  このメッセージは、トランザクションのコーディネータでのみ表示されます。 トランザクションはロールバックする必要があります。コーディネータがアクセス できる全てのサイトはチェックされ準備はできています。しかしコーディネータが アクセスできない（ネットワーク障害、ファイルシステムの未マウント、データベース ディレクトリの読み取り不能）サイトが１つ以上存在しています。 ウォームリスタートユーティリティは、アクセスできる全てのサイトでロールバックを 実行します。

  ウォームリスタートユーティリティを実行して、アクセスできるサイトの トランザクションをロールバックします。アクセスできないサイトであっても、 アクセスが可能になり次第、繰り返しロールバックを実行して、トランザクションを ロールバックすることが可能です。

  ウォームリスタートを実行中に、強制的な処理が不適切に実行されないようにする ために、アクセスできないサイトにいるユーザにトランザクションのステータスを通知 してください。ウォームリスタート（または`DISPLAY WORK`コマンド）が表示 したステータス情報の中に、警告またはエラーのメッセージがあった場合には、適切な 処置を行なう必要があります。

  コーディネータが全てのパーティシパントにアクセスできる場合、全てのサイトで セーブポイントまでのロールバックを実行することが可能です。通信が再設定されたら、 `DISPLAY WORK`コマンドを実行します。

  現在アクセスできないサイトで、トランザクションをロールバックしなければ ならない場合、そのパーティシパントにおいて強制的な`ROLLBACK WORK` コマンドを実行します。パーティシパントで強制的にロールバックを実行すると、 ユーザデータは保全されますが、コーディネータでのセーブポイントへのロールバック はできなくなります。

- `Transaction ready for commit`

  トランザクションをコミットします。コーディネータでこのメッセージが表示された 場合、全てのサイトでチェックされ準備は整えられています。コーディネータで行なう ウォームリスタートは、全てのサイトのトランザクションをコミットします。

  パーティシパントで表示された場合、パーティシパントのトランザクションの ステータスだけを表示しています。全てのサイトに関するトランザクションのステータス をチェックするには、コーディネータにおいて`DISPLAY WORK`コマンドを実行 する必要があります。

  パーティシパントで表示され、コーディネータからパーティシパントがアクセス できない場合、コーディネータでウォームリスタートを実行しても、パーティシパント で処理を実行できません。しかし、通信が再設定されてウォームリスタートを再実行 すれば、パーティシパントのトランザクションをコミットできます。パーティシパント で直ちにコミットしたい場合には、パーティシパントにおいて強制的な `COMMIT WORK`コマンドを実行する必要があります。

- `Transaction ready for commit on all available databases`

  このメッセージはコーディネータでのみ表示されます。トランザクションをコミット します。コーディネータがアクセスできる全てのサイトは、チェックされ準備は整って います。しかしコーディネータがアクセスできない（ネットワーク障害、 ファイルシステム、未マウント、データベースディレクトリの読み取り不能）サイトが １つ以上存在します。ウォームリスタートを行なえば、アクセスできる全てのサイトで トランザクションをコミットします。

  アクセスできないサイトも、アクセス可能になり次第、ウォームリスタートの 再実行でトランザクションをコミットできます。

  アクセスできないサイトで、トランザクションをコミットする必要がある場合には、 パーティシパントにおいて強制的な`COMMIT WORK`コマンドを実行します。

- `Transaction ready for restart or rollback`

  このメッセージはコーディネータでのみ表示されます。トランザクションを セーブポイントか先頭までロールバックします。全てのサイトはチェックされ準備は 整っています。この時点でウォームリスタートを実行すると、トランザクションは完全 にロールバックされます。

  コーディネータでは、`START WORK`コマンド（セーブポイントから）を使用 して、セーブポイントへのロールバックが可能です。セーブポイントまでロールバック したい場合には、コーディネータで最初にウォームリスタートしてはなりません。 ウォームリスタートは、サーブポイントまでロールバックした後、トランザクションを 再開してから使用することができます。

- `Transaction status unavailable, resolve at Coordinator database`

  このメッセージはパーシスタントで、ウォームリスタートまたは `DISPLAY WORK`コマンドの実行時に表示されます。トランザクションが コミットされたかロールバックされたか、パーシスタントでは明確に判定できません。 コーディネータにアクセスして、適切な処置を行なえないし、ウォームリスタートは 何も処理しません。

  コーディネータへのアクセスが再開できるようであれば、再開を待って コーディネータでウォームリスタートを実行します。パーティシパントで直ちに トランザクションを処理したい場合には、コーディネータのユーザに連絡し、 `DISPLAY WORK`コマンドを実行してもらいます。そのステータス情報により トランザクションを処置します。

- `Unknown Transaction`

  `DISPLAY WORK`コマンドでのみ表示されます。トランザクションIDを入力 していないか、間違えた場合に表示されます。ウォームリスタートは何も処理しません。

  トランザクションIDをチェックします。間違っていない場合には、データベースに あるトランザクションのステータス情報が失われています。ステータス情報は コーディネータで取得します。コーディネータで取得できない場合には、 パーティシパントで取得します。

  コーディネータでトランザクションを識別でき、パーティシパントでできない場合、 パーティシパントのステータス情報が失われています。この場合コーディネータで取得 したステータス情報に従います。コーディネータがパーシスタントをアクセスできない 場合、後述する警告メッセージに従います。トランザクションを取り消す旨を コーディネータが指示する場合、`Warning; possible corruption, attempt forced cancel at all sites`を参照します。 トランザクションをコミットするように指示する場合、`Warning; possible corruption, attempt forced commit at all sites`を参照します。

  パーティシパントでトランザクションを識別できたが、コーディネータでできない 場合、ステータス情報はコーディネータで失われています。`Warning; corruption at Coordinator database`を参照してください。

- `Unrecoverable error, Participant in conflict with Coordinator`

  このメッセージはコーディネータでのみ表示されます。コーディネータと パーティシパントの間で矛盾が発生しています。このような状況が発生する原因は次の の2点のいずれかです。 コーディネータがコミットの必要性を示したが、パーティシパントが強制的なロール バックを実行した。またはコーディネータがロールバックの必要性を示したが、 パーティシパントが強制的なコミットを実行した。 いずれの場合もウォームリスタートは何も処理しません。

  ユーザデータは整合性を失っています。この状況が発生したのはパーシスタントで 適切な処置がわからないまま、強制的なコミットまたはロールバックを行なったから です。データベースは`emprecov`コマンドを使用してアーカイブファイルから 復元しなければなりません。

  この状況を防止するには、パーティシパントで明確な判断ができない場合には、 コーディネータをチェックすることに注意することです。

- `Warning; corruption at Coordinator database`

  このメッセージはパーティシパントで、ウォームリスタートが実行されている場合 か、`DISPLAY WORK`コマンド実行時にのみ表示されます。コーディネータの ステータス情報は、ディスク障害で失われたかまたは人為的に削除されています。 ウォームリスタートは何の処理も行ないません。

  コーディネータでトランザクションを強制実行し、手動でステータス情報を削除 した場合、パーティシパントでも同じ処理を行なう必要があります。

  コーディネータでのトランザクションの強制実行をせず、手動でのステータス情報 の削除も行なわない場合には、データの整合性が失われます。 この場合`emprecov`コマンドを使用してアーカイブファイルからデータベース を復元する必要があります。

- `Warning; possible corruption, attempt forced cancel at all sites.`

  トランザクションを取り消すようにコーディネータで指示されているが、 ステータス情報がパーティシパントで取得できない場合、ロールバックでのみ トランザクションを復元できます。ウォームリスタートは何も処理しません。

  ステータス情報が取得できないのは、ディスク障害、パーティシパントでの強制的 なコミットまたはロールバックが原因です。パーティシパントで強制的なコミットも ロールバックも行なわれていない場合には、データはディスク障害により失われたもの と考えられます。この場合`emprecov`コマンドを使用してアーカイブファイル からデータベースを復元する必要があります。

  この状況を防止するには、パーティシパントで明確な判断ができない場合には、 コーディネータをチェックすることに注意することです。

  パーティシパントで強制のロールバックが実行された場合、コーディネータと その他全てのパーティシパントで、ロールバックを強制実行しなくてはなりません。 これによりトランザクションが復元されます。

- `Warning; possible corruption, attempt forced commit at all sites.`

  コーディネータでコミットするよう指示されていて、ステータス情報が パーシスタントで取得できない。ステータス情報以外のデータは保全されています。 ウォームリスタートは何の処理も行いません。

  ステータス情報が取得できないのは、ディスク障害、人為的削除、パーティシパント での強制的なロールバックまたはコミットが原因です。パーティシパントで強制的な ロールバックもコミットも行なわれていない場合には、`empclrlk`コマンドを 実行するかパーティシパントでサーバを再起動する必要があります。これにより パーティシパントでのロックは全て解放されます。また、コーディネータとその他 全てのパーティシパントで、トランザクションのコミットを強制実行することにより、 トランザクションは復元されます。

  パーティシパントでコミットが強制実行された場合には、全てのパーティシパント でコミットの強制実行をおこなわなければ、トランザクションは復元されません。

  パーティシパントでロールバックが強制実行された場合、データは整合性を失って います。起こりうる状況は以下に示す３点です。

  - コーディネータが`committed`段階に達し、パーティシパントが `committed phase-1`段階に達した。
  - パーティシパントがコーディネータにアクセスできずに、コミットかロールバック の判断ができなかった。
  - パーティシパントでロールバックが強制実行された。 この場合`emprecov`コマンドを使用してアーカイブファイルからデータベース を復元する必要があります。

  この状況を防止するには、パーティシパントで明確な判断ができない場合には、 コーディネータをチェックすることに注意することです。

必要な特権

  なし

例

  カレントトランザクションの表示

         * START work;
         Starting Transaction

         * UPDATE personnel (phone) VALUES ('426-6981')
              WHERE name = 'Mosca';

         * SAVEPOINT sp1;
         Setting Save Point

         * DISPLAY WORK;

         Transaction ID: 681589298
         User: docs
         Date: 11 Dec 1991 10:18:08
         Database:
         /usr/docs/repairs -- in progress

         Save Points:
         sp1

         * UPDATE personnel SET phone to '426-6982'
           WHERE name = 'Mosca';

         * SAVEPOINT sp2;
         Setting Save Point

         * DISPLAY WORK;

         Transaction ID: 681589298
         User: docs
         Date: 11 Dec 1991 10:18:08
         Database:
         /usr/docs/repairs -- in progress

         Save Points:
         sp1
         sp2

         * ROLLBACK TO sp1;
         Rolling Back to Save Point

         * DISPLAY WORK;

         Transaction ID: 681589298
         User: docs
         Date: 11 Dec 1991 10:18:08
         Database:
         /usr/docs/repairs -- in progress

         Save Points:
         sp1

         *