17.05 - COMMIT - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ操作言語

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
Release Date
2021年1月
Content Type
プログラミング リファレンス
Publication ID
B035-1146-175K-JPN
Language
日本語 (日本)

現在のANSIセッション モードのSQLトランザクションを終了し、そのトランザクションで加えられた変更をすべてコミットし、そのトランザクションの一時ジャーナルを削除します。

以下も参照してください。
  • ABORT
  • ROLLBACK
  • Teradata Vantage™ - SQLリクエストおよびトランザクション処理、B035-1142

ANSI準拠

COMMITは、ANSI SQL:2011に準拠しており、さらに拡張されています。

COMMITは、ANSIセッション モードでのみ有効です。Teradataセッション モードで使用した場合には、失敗が戻され、トランザクションがアボートされます。

その他のSQL言語は、次のような名前の類似した非ANSI規格文をサポートしています。
  • 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のルール

埋め込みSQLアプリケーション内でCOMMIT文を使用する場合は、以下のルールが当てはまります。
  • COMMITを動的SQL文として実行することはできません。
  • COMMITは、現在のトランザクション内で準備されている動的SQL文を破棄します。
  • COMMITは、開いているカーソルを閉じます。
  • COMMITは、プリプロセッサに対してTRANSACT(COMMIT)、-tr(COMMIT)、TRANSACT(ANSI)、-tr(ANSI)のいずれかのオプションを指定した場合にのみ有効です。

    プログラムがTRANSACT(BTET)、-tr(BTET)、TRANSACT(2PC)プリプロセッサ オプションでプリコンパイルされている場合に、COMMITを使用するとエラーが発生します。

  • RELEASEオプションを指定した場合は、データベースとのアプリケーション プログラム接続は(明示接続または暗黙接続のどちらでも)終了します。

    その後、追加のSQLリクエスト(CONNECTまたはLOGON以外)を実行する場合は、暗黙接続が試みられます。

  • プリプロセッサに対してTRANSACT(ANSI)または-tr(ANSI)オプションを指定した場合は、RELEASEが無効になります。

ABORTおよびROLLBACKとの関係

ABORT文とROLLBACK文も現在のトランザクションを終了しますが、コミットの代わりにロールバックが発生します。ABORTROLLBACKを参照してください。

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