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
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
句を指定して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';