ヘッダーをスキップ
Oracle® Database SQL言語リファレンス
11gリリース2 (11.2)
B56299-06
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

COMMIT

用途

COMMIT文を使用すると、現行のトランザクションを終了し、トランザクションで実行したすべての変更を確定できます。トランザクションとは、Oracle Databaseが1つの単位として扱う一連のSQL文です。また、この文によって、トランザクション内のセーブポイントがすべて消去され、トランザクション・ロックが解除されます。

トランザクションをコミットするまでは、次の操作が可能です。

  • 変更された表を問い合せることで、トランザクション中に加えた変更内容を確認する。ただし、他のユーザーは変更内容を参照できません。トランザクションをコミットすると、コミット後に実行される他のユーザーの文に変更が表示されるようになります。

  • トランザクション中に行った変更を、ROLLBACK文でロールバックする(元に戻す)。「ROLLBACK」を参照してください。

次のような状況では、Oracle Databaseによって暗黙的なCOMMITが発行されます。

  • 構文が有効なデータ定義言語(DDL)文の前(文がエラーになる場合も同様)

  • エラーが発生することなく完了するデータ定義言語(DDL)文の後

この文を使用して次の操作を実行することもできます。

  • インダウト分散トランザクションを手動でコミットします。

  • SET TRANSACTION文で開始した読取り専用トランザクションを終了します。

Oracle Databaseとの接続を切断する前に、最新のトランザクションを含むアプリケーション・プログラムのすべてのトランザクションを、COMMIT文またはROLLBACK文を使用して明示的に終了することをお薦めします。トランザクションを明示的にコミットしなかった場合にプログラムが異常終了すると、コミットされていない最後のトランザクションは、自動的にロールバックされます。

OracleユーティリティおよびOracleのツール製品が正常に終了すると、現行のトランザクションがコミットされます。Oracleプリコンパイラ・プログラムが正常に終了した場合は、トランザクションはコミットされず、現行のトランザクションがOracle Databaseによってロールバックされます。


関連項目:

  • トランザクションの詳細は、『Oracle Database概要』を参照してください。

  • トランザクションの特性の指定の詳細は、「SET TRANSACTION」を参照してください。


前提条件

現行のトランザクションをコミットするために、必要な権限は特にありません。

自分がコミットしたインダウト分散トランザクションを手動でコミットする場合は、FORCE TRANSACTIONシステム権限が必要です。別のユーザーがコミットしたインダウト分散トランザクションを手動でコミットする場合は、FORCE ANY TRANSACTIONシステム権限が必要です。

構文

commit::=

commit.gifの説明が続きます。
commit.gifの説明

セマンティクス

COMMIT

COMMITキーワードに続く句は、すべてオプションです。COMMITのみを指定した場合、デフォルトはCOMMIT WORK WRITE WAIT IMMEDIATEです。

WORK

標準SQLに準拠するために、WORKキーワードがサポートされています。COMMIT文とCOMMIT WORK文は同じです。

COMMENT句

この句は、下位互換性を保つためにのみサポートされています。コミット・コメントのかわりに名前付きトランザクションを使用することをお薦めします。


関連項目:

名前付きトランザクションの詳細は、「SET TRANSACTION」および『Oracle Database概要』を参照してください。

現行のトランザクションに関するコメントを指定します。'text'は引用符で囲まれた最大255バイトのリテラルで、分散トランザクションの状態が不明(インダウト)になった場合に、そのトランザクションIDとともに、データ・ディクショナリ・ビューDBA_2PC_PENDINGに格納されます。このコメントは、分散トランザクションの障害を診断するときに役立ちます。


関連項目:

SQL文へのコメントの追加の詳細は、「COMMENT」を参照してください。

WRITE句

この句を使用すると、コミット操作で生成されるREDO情報をREDOログに書き込む優先度を指定できます。この句によって、待機時間を減らしREDOログへのI/Oを待機しないようにすることで、パフォーマンスを向上させることができます。この句は、レスポンス時間に対する要件が厳しい次のような環境下でのレスポンス時間を改善するために使用します。

  • 更新トランザクションの量が多く、REDOログを頻繁にディスクに書き込む必要がある。

  • アプリケーションが、非同期でコミットされるトランザクションの消失を許容できる。

  • REDOログの書込みの発生を待つ待機時間が、全体のレスポンス時間に大きく影響する。

WAIT | NOWAITおよびIMMEDIATE | BATCH句を任意の順序で指定できます。


注意:

この句を省略したときのコミット操作は、COMMIT_LOGGINGおよびCOMMIT_WAIT初期化パラメータで制御されます(パラメータが設定されている場合)。

WAIT | NOWAIT この句を使用すると、制御をいつユーザーに戻すかを指定できます。

  • WAITパラメータを指定すると、対応するREDOがオンラインREDOログで永続的になった後にのみコミットが戻ります。BATCHモードでもIMMEDIATEモードでも、このCOMMIT文から正常にクライアントに戻ったときは、トランザクションは永続メディアにコミットされています。ログへの正常な書込みの後で障害が発生した場合、成功のメッセージがクライアントに戻らない場合があります。この場合には、トランザクションがコミットされたかどうかはクライアントにはわかりません。

  • NOWAITパラメータを指定すると、REDOログへの書込みが完了したかどうかに関係なく、コミットはクライアントに戻ります。この動作によって、トランザクションのスループットが向上します。WAITパラメータを指定すると、コミット・メッセージを受け取った場合にデータの損失がないことがわかります。


注意:

NOWAITを指定すると、コミット・メッセージを受け取った後で、REDOログ・レコードが書き込まれる前に障害が発生した場合、その変更が永続的であることをトランザクションに誤って示す場合があります。

この句を指定しない場合、トランザクションはWAITの動作でコミットされます。

IMMEDIATE | BATCH この句を使用すると、REDOをいつログに書き込むかを指定できます。

  • IMMEDIATEパラメータを指定すると、ログ・ライター・プロセス(LGWR)によって、トランザクションのREDO情報がログに書き込まれます。この操作オプションはディスクI/Oを強制するため、トランザクションのスループットは低下します。

  • BATCHパラメータを指定すると、同時に実行されている他のトランザクションとともに、REDOがREDOログにバッファされます。十分なREDO情報が収集されると、REDOログのディスク書込みが開始されます。この動作はグループ・コミットと呼ばれます。複数のトランザクションのREDOが一度のI/O操作でログに書き込まれるためです。

この句を指定しない場合、トランザクションはIMMEDIATEの動作でコミットされます。


関連項目:

非同期のコミットの詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

FORCE句

この句を使用すると、インダウト分散トランザクションまたは破損トランザクションを手動でコミットできます。

  • 分散データベース・システムでは、FORCE string [, integer]句によって、手動でインダウト分散トランザクションをコミットできます。このトランザクションは、ローカル・トランザクションIDまたはグローバル・トランザクションIDを含む'string'で識別されます。このトランザクションのIDを確認する場合は、データ・ディクショナリ・ビューDBA_2PC_PENDINGを問い合せます。また、integerを指定することによって、このトランザクションにシステム変更番号(SCN)を具体的に割り当てることもできます。integerを指定しない場合、このトランザクションは現行のSCNを使用してコミットされます。

  • FORCE CORRUPT_XID 'string'句によって、1つの破損トランザクションを手動でコミットできます。stringは、破損トランザクションのIDです。V$CORRUPT_XID_LISTデータ・ディクショナリ・ビューを問い合せて、破損トランザクションのトランザクションIDを検索します。V$CORRUPT_XID_LISTを表示し、この句を指定するには、DBA権限が必要です。

  • FORCE CORRUPT_XID_ALLを指定すると、すべての破損トランザクションを手動でコミットできます。この句を指定するには、DBA権限が必要です。


注意:

FORCE句を指定してCOMMIT文を発行した場合、指定したトランザクションのみがコミットされます。この文は、現行のトランザクションには影響しません。


関連項目:

前述の項目の詳細は、『Oracle Database管理者ガイド』を参照してください。

挿入のコミット例: 次の文は、hr.regions表に行を挿入してこの変更をコミットします。

INSERT INTO regions VALUES (5, 'Antarctica'); 

COMMIT WORK;
 

同じ挿入操作をコミットし、データベースに対して、ディスクI/Oを開始せずに変更をREDOログにバッファするよう指示するには、次のCOMMIT文を使用します。

COMMIT WRITE BATCH;

COMMITのコメント例: 次の文は、現行のトランザクションをコミットして、コメントを関連付けます。

COMMIT 
    COMMENT 'In-doubt transaction Code 36, Call (415) 555-2637'; 

ネットワーク障害またはマシン障害によって分散トランザクションを適切にコミットできない場合、トランザクションIDとともにデータ・ディクショナリにコメントが格納されます。そのコメントには、障害が発生したアプリケーション部分が示されており、トランザクションがコミットされたデータベースの管理者に連絡する情報が提供されています。

強制インダウト・トランザクションの例: 次の文は、不確定なインダウト分散トランザクションを手動でコミットします。V$CORRUPT_XID_LISTデータ・ディクショナリ・ビューを問い合せて、破損トランザクションのトランザクションIDを検索します。V$CORRUPT_XID_LISTを表示し、この文を発行するには、DBA権限が必要です。

COMMIT FORCE '22.57.53';