データ制御言語 (DCL) コマンドはデータ保全およびセキュリティも ために提供されます。利用可能なDCLコマンドの要約を以下に示します。
Table 6-1: データ制御言語コマンド
コマンド | 概要 |
START WORK | COMMIT WORKまたはROLLBACKコマンド発行されるまで、 データベースには反映されない1セットのコマンドを実行します。 |
COMMIT WORK | トランザクション中に行なわれたデータベースへの変更を確定します。 |
ROLLBACK | トランザクション中に行なわれたデータベースへの変更を無効にします。 |
SAVEPOINT | トランザクション中に行なわれた変更を確定するポイントを設定します。 ROLLBACKコマンドによって、ポイントまで回復することができます。 |
DISPLAY WORK | 現在のトランザクション状況を表示します。 |
START WORKコマンドはトランザクションという一連のコマンドの実行を 開始します。トランザクション中はデータベースへの変更は一時的であり、 トランザクションの終了時に変更の確定または取り消しが行なわれます。
ディスク、オペレーティングシステム、ネットワークなどに障害が発生した場合、 トランザクションはウォームリスタート機能により、トランザクションの確定または 取り消し処理が行なわれます。この機能によりトランザクションに関連したデータの 整合性が保証されます。ウォームリスタート機能については、 Empress: Database Administrator's Guide を参照してください。
トランザクションの一般的な概要については、 Empress SQL: ユーザーズガイドを参照してください。
Syntax
START | |WORK |TRANSACTION |
| [[database:]id [FROM savepoint]];
| |
説明
database | データベース名。 |
savepoint | トランザクション中のセーブポイント名です。英字で始まる必要があります。 |
id | トランザクションID。 |
注意
START WORK;
は、トランザクションを開始します。 すでにトランザクションが開始されていた場合、トランザクションは既に開始されて いる旨のメッセージが表示されます。
START WORK database:id FROM savepoint;
は、システム障害によって中断されたトランザクションを回復するために使用され ます。トランザクションを続行できるように再開して、現在のユーザの環境内で指定 されたセーブポイントからの指定された処理を回復します。 セーブポイントが指定されない場合、最後に定義されたセーブポイントが使用されます。 セーブポイントのないトランザクションはセーブポイントへのロールバックはできま せん。トランザクションIDおよびセーブポイントの名前はDISPLAY WORK コマンドで取得できます。
必要な特権
なし
例
トランザクションの開始
トランザクションを開始し、データを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
ネストされたトランザクション
トランザクションを開始し、セーブポイントを設定した後にセーブポイントまで ロールバックし、最後にコミットします。
* START WORK; Starting Transaction . . . * SAVEPOINT sp1; Setting Save Point . . . * ROLLBACK WORK TO sp1; Rolling Back to Save Point * COMMIT WORK; Committing Transaction
COMMIT WORKコマンドは、カレントトランザクションにおけるデータベース への変更を確定し、トランザクションを終了します。トランザクションは START WORKコマンドで開始します。
Syntax
COMMIT [ | |WORK |TRANSACTION |
|] [[database:]id]; | |
説明
database | データベース名。 |
id | トランザクションID。 |
注意
COMMIT WORK;
は、トランザクション中に使用され、トランザクションを確定します (全ての変更を反映します)。トランザクションが開始されていない場合には、 エラーメッセージを表示します。
トランザクションは部分的にコミットできません。ネストされた全ての トランザクションがコミットされます。
COMMIT WORK database:id;
は、指定されたトランザクションを強制的にコミットします。カレントの トランザクションでないものに対してのみ発行できます。トランザクションでの全ての 変更が確定されます。コーディネータ(最初にアクセスされるデータベース)で実行 した場合、コーディネータと全てのパーティシパント(その他のデータベース)に 影響するトランザクションがコミットされます。パーティシパントで実行した場合には、 コーディネータと現在のパーティシパントに影響するトランザクションのみコミット されます。
システム障害からのトランザクションの復元については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
ROLLBACK WORKコマンドは、カレントトランザクションで処理した全ての コマンドを取り消し、トランザクションを開始する前の状態にデータベースを復元 します。トランザクションはSTART WORKコマンドで開始します。
Syntax
|ROLLBACK |CANCEL |
| [ | |
|WORK |TRANSACTION |
|] [ | |
|TO savepoint |[database:]id |
|]; | |
説明
savepoint | トランザクション中のセーブポイント名。英字で始まる文字列です。 |
database | データベース名。 |
id | トランザクションID。 |
注意
ROLLBACK WORK TO savepoint;
は、トランザクションをロールバックします。セーブポイントを指定した場合、 トランザクションは指定セーブポイントまでロールバックされますが、 トランザクションは終了しません。セーブポイントの設定はSAVEPOINT コマンドで行なっておかなくてはなりません。セーブポイントを指定しない場合には、 トランザクション全体がロールバックします。トランザクション中の全処理が取り消 され、トランザクションは終了されます。
ROLLBACK WORK database:id;
は、指定したトランザクションIDを持つトランザクションを強制的にロールバック します。カレントのトランザクションでないものに対してのみ発行できます。 データベースに対する全ての操作は取り消されます。 コーディネータ(最初にアクセスされるデータベース)で実行した場合、 コーディネータと全パーティシパント(その他のデータベース)に関わる トランザクションは取り消されます。パーティシパントで実行した場合には、 コーディネータとそのパーティシパントに関わるトランザクションのみ取り消されます。
必要な特権
なし
例
トランザクションの取り消し
以下の操作で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
セーブポイントまでのロールバック
次のコマンドでトランザクションを開始し、セーブポイントを設定した後に、 セーブポイントまでロールバックしセーブポイントまでの処理はコミットします。
* START WORK; . . . * SAVEPOINT sp1; . . . * ROLLBACK WORK TO sp1; Rolling Back to Save Point * COMMIT WORK; Committing Transaction
SAVEPOINTコマンドは、トランザクション中にセーブポイントを設定 します。このコマンドはトランザクションの中でないと有効ではありません。
Syntax
SAVEPOINT savepoint;
説明
savepoint | ユーザにより与えられたセーブポイント名。英字で始まる文字列です。 |
注意
必要な特権
なし
例
次のコマンドでトランザクションを開始し、セーブポイントを設定したのち、 セーブポイントまでロールバック後にセーブポイントまでのトランザクションを コミットします。
* START WORK; . . . * SAVEPOINT sp1; . . . * ROLLBACK WORK TO sp1; Rolling Back to Save Point * COMMIT WORK; Committing Transaction
DISPLAY WORKコマンドは、トランザクションについてのステータス情報を 表示します。ID、コメント、トランザクションを開始したユーザ名、トランザクション の日付、トランザクション保護されている旨のメッセージ、コーディネータと パーティシパント、セーブポイント、トランザクションの全面的なステータス評価を 表示します。
Syntax
DISPLAY | |WORK |TRANSACTION |
| [ | |
|ON | |
|DB |database |
| [ALL] | |
|]; | |
| [ | database:]id | | |
説明
id | トランザクションID。 |
注意
DISPLAY WORK;
は、トランザクションの中で発行できます。カレントトランザクションの状況を 表示します。
ステータスメッセージ
トランザクションはキャンセルされました。確定された処理はなく、 トランザクション情報は削除されました。
トランザクションは確定されました。ロールバックすることはできなく、 トランザクション情報は削除されました。
トランザクションを確定する準備ができました。しかしこの状態ではコミットも ロールバックも可能です。ステータス情報はデータベースの中にあります。
トランザクションはデータベースに対して進行中(続行中)です。コミットまたは ロールバックの指示は受け付けません。ステータス情報はデータベースの中にあります。 トランザクションはコミットできません。
データベースにはアクセスできません。原因として考えられるにのは、 ネットワーク障害、ディスクのマウントエラー、データベースディレクトリの読み取り 不可能などです。ユーザがパーティシパントで、コーディネータにアクセスできない 場合には、コーディネータのユーザに連絡し、トランザクションのステータスを確認 する必要があります。
ステータス情報がデータベースに存在しない場合、これは以下のいずれかの理由に よります。
コーディネータによるステータス情報の復元ができない場合には、コーディネータ のユーザに連絡し、トランザクションはどのような処理が実行されたか確認する必要が あります。一般的に全データベースでトランザクションが完了していない限り、 ステータス情報はコーディネータに残されているはずです。
全体的なステータスメッセージ (トランザクション単位)
トランザクションをロールバックします。コーディネータで表示されている場合 には、全サイトがチェックされ準備が整えられます。ウォームリスタート ユーティリティ(コーディネータで実行)は、全サイトでトランザクションを ロールバックします。
このメッセージがパーティシパントで表示された場合、これはパーティシパントの トランザクションのステータスを表示します。またコーディネータでのセーブポイント へのロールバックでの可能性もあります。コーディネータでDISPLAY WORK コマンドを実行してチェックしてください。
パーティシパントのメッセージに対処して、コーディネータではウォームリスタート ユーティリティまたはDISPLAY WORKコマンドを実行します。 この時パーティシパントにアクセスできない旨のメッセージが表示されても、通信が 再接続されればコーディネータのセーブポイントにロールバックできる可能性は残され ます。
パーティシパントで強制的なロールバックを行なうと、パーティシパントのデータ は保全されます。しかし、コーディネータのセーブポイントへのロールバックは不可能 となります。
このメッセージは、トランザクションのコーディネータでのみ表示されます。 トランザクションはロールバックする必要があります。コーディネータがアクセス できる全てのサイトはチェックされ準備はできています。しかしコーディネータが アクセスできない(ネットワーク障害、ファイルシステムの未マウント、データベース ディレクトリの読み取り不能)サイトが1つ以上存在しています。 ウォームリスタートユーティリティは、アクセスできる全てのサイトでロールバックを 実行します。
ウォームリスタートユーティリティを実行して、アクセスできるサイトの トランザクションをロールバックします。アクセスできないサイトであっても、 アクセスが可能になり次第、繰り返しロールバックを実行して、トランザクションを ロールバックすることが可能です。
ウォームリスタートを実行中に、強制的な処理が不適切に実行されないようにする ために、アクセスできないサイトにいるユーザにトランザクションのステータスを通知 してください。ウォームリスタート(またはDISPLAY WORKコマンド)が表示 したステータス情報の中に、警告またはエラーのメッセージがあった場合には、適切な 処置を行なう必要があります。
コーディネータが全てのパーティシパントにアクセスできる場合、全てのサイトで セーブポイントまでのロールバックを実行することが可能です。通信が再設定されたら、 DISPLAY WORKコマンドを実行します。
現在アクセスできないサイトで、トランザクションをロールバックしなければ ならない場合、そのパーティシパントにおいて強制的なROLLBACK WORK コマンドを実行します。パーティシパントで強制的にロールバックを実行すると、 ユーザデータは保全されますが、コーディネータでのセーブポイントへのロールバック はできなくなります。
トランザクションをコミットします。コーディネータでこのメッセージが表示された 場合、全てのサイトでチェックされ準備は整えられています。コーディネータで行なう ウォームリスタートは、全てのサイトのトランザクションをコミットします。
パーティシパントで表示された場合、パーティシパントのトランザクションの ステータスだけを表示しています。全てのサイトに関するトランザクションのステータス をチェックするには、コーディネータにおいてDISPLAY WORKコマンドを実行 する必要があります。
パーティシパントで表示され、コーディネータからパーティシパントがアクセス できない場合、コーディネータでウォームリスタートを実行しても、パーティシパント で処理を実行できません。しかし、通信が再設定されてウォームリスタートを再実行 すれば、パーティシパントのトランザクションをコミットできます。パーティシパント で直ちにコミットしたい場合には、パーティシパントにおいて強制的な COMMIT WORKコマンドを実行する必要があります。
このメッセージはコーディネータでのみ表示されます。トランザクションをコミット します。コーディネータがアクセスできる全てのサイトは、チェックされ準備は整って います。しかしコーディネータがアクセスできない(ネットワーク障害、 ファイルシステム、未マウント、データベースディレクトリの読み取り不能)サイトが 1つ以上存在します。ウォームリスタートを行なえば、アクセスできる全てのサイトで トランザクションをコミットします。
アクセスできないサイトも、アクセス可能になり次第、ウォームリスタートの 再実行でトランザクションをコミットできます。
アクセスできないサイトで、トランザクションをコミットする必要がある場合には、 パーティシパントにおいて強制的なCOMMIT WORKコマンドを実行します。
このメッセージはコーディネータでのみ表示されます。トランザクションを セーブポイントか先頭までロールバックします。全てのサイトはチェックされ準備は 整っています。この時点でウォームリスタートを実行すると、トランザクションは完全 にロールバックされます。
コーディネータでは、START WORKコマンド(セーブポイントから)を使用 して、セーブポイントへのロールバックが可能です。セーブポイントまでロールバック したい場合には、コーディネータで最初にウォームリスタートしてはなりません。 ウォームリスタートは、サーブポイントまでロールバックした後、トランザクションを 再開してから使用することができます。
このメッセージはパーシスタントで、ウォームリスタートまたは DISPLAY WORKコマンドの実行時に表示されます。トランザクションが コミットされたかロールバックされたか、パーシスタントでは明確に判定できません。 コーディネータにアクセスして、適切な処置を行なえないし、ウォームリスタートは 何も処理しません。
コーディネータへのアクセスが再開できるようであれば、再開を待って コーディネータでウォームリスタートを実行します。パーティシパントで直ちに トランザクションを処理したい場合には、コーディネータのユーザに連絡し、 DISPLAY WORKコマンドを実行してもらいます。そのステータス情報により トランザクションを処置します。
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を参照してください。
このメッセージはコーディネータでのみ表示されます。コーディネータと パーティシパントの間で矛盾が発生しています。このような状況が発生する原因は次の の2点のいずれかです。 コーディネータがコミットの必要性を示したが、パーティシパントが強制的なロール バックを実行した。またはコーディネータがロールバックの必要性を示したが、 パーティシパントが強制的なコミットを実行した。 いずれの場合もウォームリスタートは何も処理しません。
ユーザデータは整合性を失っています。この状況が発生したのはパーシスタントで 適切な処置がわからないまま、強制的なコミットまたはロールバックを行なったから です。データベースはemprecovコマンドを使用してアーカイブファイルから 復元しなければなりません。
この状況を防止するには、パーティシパントで明確な判断ができない場合には、 コーディネータをチェックすることに注意することです。
このメッセージはパーティシパントで、ウォームリスタートが実行されている場合 か、DISPLAY WORKコマンド実行時にのみ表示されます。コーディネータの ステータス情報は、ディスク障害で失われたかまたは人為的に削除されています。 ウォームリスタートは何の処理も行ないません。
コーディネータでトランザクションを強制実行し、手動でステータス情報を削除 した場合、パーティシパントでも同じ処理を行なう必要があります。
コーディネータでのトランザクションの強制実行をせず、手動でのステータス情報 の削除も行なわない場合には、データの整合性が失われます。 この場合emprecovコマンドを使用してアーカイブファイルからデータベース を復元する必要があります。
トランザクションを取り消すようにコーディネータで指示されているが、 ステータス情報がパーティシパントで取得できない場合、ロールバックでのみ トランザクションを復元できます。ウォームリスタートは何も処理しません。
ステータス情報が取得できないのは、ディスク障害、パーティシパントでの強制的 なコミットまたはロールバックが原因です。パーティシパントで強制的なコミットも ロールバックも行なわれていない場合には、データはディスク障害により失われたもの と考えられます。この場合emprecovコマンドを使用してアーカイブファイル からデータベースを復元する必要があります。
この状況を防止するには、パーティシパントで明確な判断ができない場合には、 コーディネータをチェックすることに注意することです。
パーティシパントで強制のロールバックが実行された場合、コーディネータと その他全てのパーティシパントで、ロールバックを強制実行しなくてはなりません。 これによりトランザクションが復元されます。
コーディネータでコミットするよう指示されていて、ステータス情報が パーシスタントで取得できない。ステータス情報以外のデータは保全されています。 ウォームリスタートは何の処理も行いません。
ステータス情報が取得できないのは、ディスク障害、人為的削除、パーティシパント での強制的なロールバックまたはコミットが原因です。パーティシパントで強制的な ロールバックもコミットも行なわれていない場合には、empclrlkコマンドを 実行するかパーティシパントでサーバを再起動する必要があります。これにより パーティシパントでのロックは全て解放されます。また、コーディネータとその他 全てのパーティシパントで、トランザクションのコミットを強制実行することにより、 トランザクションは復元されます。
パーティシパントでコミットが強制実行された場合には、全てのパーティシパント でコミットの強制実行をおこなわなければ、トランザクションは復元されません。
パーティシパントでロールバックが強制実行された場合、データは整合性を失って います。起こりうる状況は以下に示す3点です。
この状況を防止するには、パーティシパントで明確な判断ができない場合には、 コーディネータをチェックすることに注意することです。
必要な特権
なし
例
カレントトランザクションの表示
* 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 *