目的
現在のANSIセッション モードのSQLトランザクションを終了し、そのトランザクションで加えられた変更をすべてコミットし、そのトランザクションの一時ジャーナルを削除します。
必要な権限
なし。
構文
構文要素
- WORK
- SQLフラッガーが有効になっている場合、WORKを省略すると、リクエストにフラグが付けられます。
- RELEASE
- クライアント アプリケーション プログラムとTeradata Databaseをつなぐ接続(暗黙接続または明示接続のどちらでも)が終了します。
ANSI準拠
COMMITは、ANSI SQL:2011に準拠しており、さらに拡張されています。
COMMITは、ANSIセッション モードでのみ有効です。Teradataセッション モードで使用した場合には、失敗が戻され、トランザクションがアボートされます。
- COMMIT TRANSACTION
- COMMIT WORK
ANSIトランザクションの定義および終了方法
ANSIセッション モードでは、セッションの最初のSQLリクエストがトランザクションを開始します。そのトランザクションは、COMMIT、ROLLBACK、またはABORTリクエストのどれかを発行すると終了します。リクエストが失敗しても、トランザクションはロールバックされない。ロールバックが発生するのはリクエストの場合のみです。
COMMITは明示的
ANSIセッション モードには、暗黙的なトランザクションはありません。より正確に言うと、各ANSIトランザクションは暗黙的に開始されますが、常に明示的に完了します。COMMITは、必ず明示的に指定しなければならず、トランザクションを正常に終了させるためには、トランザクションの最後のリクエストでなければなりません。
ANSIセッション モードでは、トランザクション内のリクエストがSELECTまたはSELECT AND CONSUMEのみの場合でも、COMMIT (またはABORT/ROLLBACK) 文のどれかを発行する必要があります。
SELECTリクエストの場合、COMMITまたはABORT/ROLLBACKのいずれを発行しても違いはありません。
SELECT AND CONSUMEの場合、COMMITを発行するのと、ABORT/ROLLBACKを発行するのとでは出力に相違がです。これは、ABORTまたはROLLBACKリクエストはリクエストのサブジェクト キュー テーブルを以前のステータスに回復し、これにはアボートされたSELECT AND CONSUMEリクエストで擬似的に消費された行も含まれるからです。
埋め込みSQLのルール
- COMMITを動的SQL文として実行することはできません。
- COMMITは、現在のトランザクション内で準備されている動的SQL文を破棄します。
- COMMITは、開いているカーソルを閉じます。
- COMMITは、プリプロセッサに対してTRANSACT(COMMIT)、-tr(COMMIT)、TRANSACT(ANSI)、-tr(ANSI)のいずれかのオプションを指定した場合にのみ有効です。
プログラムがTRANSACT(BTET)、-tr(BTET)、TRANSACT(2PC)プリプロセッサ オプションでプリコンパイルされている場合に、COMMITを使用するとエラーが発生します。
- RELEASEオプションを指定した場合は、Teradata Databaseとのアプリケーション プログラム接続は(明示接続または暗黙接続のどちらでも)終了します。
その後、追加のSQLリクエスト(CONNECTまたはLOGON以外)を実行する場合は、暗黙接続が試みられます。
- プリプロセッサに対してTRANSACT(ANSI)または-tr(ANSI)オプションを指定した場合は、RELEASEが無効になります。
ABORTおよびROLLBACKとの関係
ABORT文とROLLBACK文も現在のトランザクションを終了しますが、コミットの代わりにロールバックが発生します。ABORTとROLLBACKを参照してください。
COMMITおよびBTEQ
BTEQスクリプトで、COMMITを.SESSIONまたは.REPEATコマンドとともに使用する場合には、COMMITリクエストと、繰り返されるSQLリクエストを1つのリクエストとして送信しなければなりません。
繰り返されるリクエストをCOMMITなしで送信すると、リクエストのうちの1つが他のセッションによってブロックされ、そのジョブはデッドロックのためにハングします。
次のダミーの例に、どのようにしてそれが起こるかを示します。
.SESSION TRANS ANSI .SESSIONS 10 .LOGON TDPID/USER,PASSWD .IMPORT DATA FILE = data_file_name .REPEAT I USING i(INTEGER), j(INTEGER) INSERT INTO table_name (col1, col2) VALUES (:1, :j); COMMIT; .QUIT
例: INSERTリクエスト
次の例のINSERTリクエストは、トランザクションをオープンします。COMMITは、そのトランザクションをクローズします。
INSERT INTO employee (name, empno) VALUES ('Sinclair P', 101) WHERE dept = '400'; COMMIT;
例: UPDATEの後のCOMMIT
次のUPDATEは、トランザクションを開始し、COMMIT WORKはそのトランザクションを終了させます。
UPDATE parts SET part_num = 20555 WHERE location = 'seoul'; COMMIT WORK;