17.00 - 17.05 - ANSIおよびTeradataセッション モードにおけるトランザクションの比較 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLリクエストおよびトランザクション処理

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
ユーザー ガイド
Publication ID
B035-1142-170K-JPN
Language
日本語 (日本)

ANSIセッション モードでは、トランザクション処理の動作はANSI SQL:2011仕様で定義されたルールに則って行なわれます。Teradata(またはBTET)セッション モードでのトランザクション処理は、Teradataによって定義されたルール一式に則って行なわれます。Teradataセッション モードは、レガシー アプリケーションによるトランザクション処理を管理するための手段となります。

ANSIセッション モードで、各トランザクションは1つ以上のリクエストから構成され、各リクエストは1つ以上のSQL文から構成されます(トランザクション、リクエスト、および文を参照)。

複数文リクエストは、1つの分割不能な単位として扱われます。複数文リクエストに含まれるすべての文が実行したすべての作業がコミットされるか、またはそのどれもコミットされないかのどちらかになります。

トランザクションの意味を離れれば、ANSIモードとTeradataセッション モードの両方で同じことを実行するように、SQLコードに明示的に指定を書き込んでデフォルトを変更することができます。

ルール ANSIセッション モード Teradataセッション モード
トランザクションの開始 トランザクションが開始するのは、アクティブなトランザクションのない状態でSQLリクエストが実行された場合です。
トランザクションは、以下のいずれかにより開かれます。
  • セッションの中で最初に実行されるSQLリクエスト。
  • ANSIセッション モードのトランザクションの終了に続いて、セッションにおける次のリクエストが実行されます。

BEGIN TRANSACTION(BT)文は無効です。

トランザクションは、現時点でアクティブなトランザクションがなく、以下の任意のが発生した場合に開始されます。
  • SQLリクエストが実行される(暗黙的なトランザクション)。
  • BEGIN TRANSACTIONリクエスト(明示的トランザクション)がある。

    BEGIN TRANSACTION(BT)によって開始されない限り、システムは各リクエストを暗黙的トランザクションとして扱います(トランザクション、リクエスト、および文を参照)。

トランザクションの終了 トランザクションは、COMMIT [WORK]やROLLBACK [WORK](またはABORT)文、または失敗、タイムアウト、ログオフ、またはシステムの再始動で終了します。

END TRANSACTION文は無効です。

  • 暗黙的トランザクションは、リクエストの最後、ROLLBACKまたはABORT文、失敗、タイムアウト、またはシステムの再始動時に終了します。

    暗黙的トランザクションは、正常に終了するか(成功応答)、または失敗応答を生じさせるときに終了します。 (成功応答、警告応答、エラー応答、および失敗応答について詳しくは、<Teradata Vantage™ - SQLの基本、B035-1141>を参照してください。)

  • 明示的トランザクションは、END TRANSACTION文、ROLLBACK、またはABORT文、失敗、タイムアウト、ログオフ、またはシステムの再始動で終了します。

    ネストされたトランザクションの場合には、トランザクションを終了するのは最初に検出されるEND TRANSACTIONリクエストではなく最後に検出されるものです。

COMMITリクエストは無効です。

同じスクリプト内に明示的トランザクションと暗黙的トランザクションの両方を混在させることができます。

トランザクションがコミットすると、Teradata Databaseはその一時ジャーナル(ロールバック トランザクションへの一時ジャーナルの使用を参照)を廃棄して、開いているカーソルを閉じます。

トランザクションが明示的に、またはEND TRANSACTION文によって正常にコミットされない場合、データベースはトランザクションのリクエストをすべてロールバックします。

カーソル デフォルトで位置決めされている。 デフォルトで位置決めされていない。
エラー時の動作 エラーでは、トランザクション全体ではなく、それらの原因となるリクエストのみをロールバックします。

成功応答、警告応答、エラー応答、および失敗応答について詳しくは、<Teradata Vantage™ - SQLの基本、B035-1141>を参照してください。

つまり、ANSIモードのトランザクションは、エラー応答が生じたときにトランザクション全体をロールバックしないので、普遍的な原子性を持ちません。その結果、それらはすべての状況でACIDトランザクションのAプロパティ(トランザクションのACIDプロパティを参照)をサポートしていません。

トランザクションが常に意図されたとおりに扱われるようにするためには、エラーを発生させたリクエストをメンバーとして含むトランザクション全体ではなく、そのリクエストだけがロールバックされる状況を扱うロジックを使用して、アプリケーションをコーディングすることが重要です。

ANSIセッション モードでは、後続の非ブランク文字の切捨ての制御によりエラーが発生します。

SUBSTRING関数を使用して、そうしたエラーを回避します。 詳細は、<Teradata Vantage™ - SQL関数、式、および述部、B035-1145>を参照してください。

エラーの生じたリクエストによって設定されたロックは解放されず、一時ジャーナルはディクショナリから削除されません。

適用なし。

ANSIモードでエラーとみなされるものは、Teradataセッション モードで失敗として扱われます。

失敗の動作 エラーが発生すると、トランザクション全体をロールバックします。

一時ジャーナルは、まず適用され、次にディクショナリから削除され、それからすべてのロックが解放されます。

トランザクションが失敗すると、システムは最初にそれを自動的にロールバックしてから、一時ジャーナルを廃棄して、オープンしているカーソルを閉じます。Teradataセッション モードでは、ロールバックを生じさせるために、ABORTリクエストまたはROLLBACKリクエストを実行する必要はありません。

失敗応答は、それらを引き起こしたリクエストだけでなく、トランザクション全体をロールバックします。エラー応答は発生しません。つまり、ANSIセッション モードでエラーとして扱われるどの応答も、Teradataセッション モードでは失敗応答として扱われます。

文字の比較におけるデフォルトの属性 CASESPECIFIC NOT CASESPECIFIC
TRIMのデフォルト動作 TRIM(BOTH FROM …) TRIM(BOTH FROM …)
文字の切捨てエラーの制御 埋め込み文字が後に続く場合の切り捨ての問題に関するエラー応答。 切り捨ての問題で失敗が発生することはありません。切り捨てはサイレントに適用されます。
デフォルトのテーブル タイプの意味 MULTISET

これは、行を更新するとき、あるいは行をテーブルに挿入するときに、重複行が許可されるということです。

SET

これは、行を更新するとき、あるいは行をテーブルに挿入するときに、重複行が許可されないということです。

DDL文の配置 オプションのCOMMIT文を除いて、トランザクションの最後のリクエストにおける唯一の文である必要があります。

COMMITリクエストを発行する前に別のDDLリクエストを実行しようとすると、データベースは無効なリクエストのエラーを返しますが、トランザクションはロールバックしません。

それらは正式にはDCL文ですが、データベースはトランザクションを処理する目的でDATABASEおよびSET SESSION文をDDL文として扱います。

明示的トランザクションのEND TRANSACTIONを除いて、トランザクションで最後のリクエストにおける唯一の文である必要があります。

トランザクションをコミットする前に別のDDLリクエストを実行しようとすると、システムは無効なリクエストの失敗応答を返してから、トランザクションをロールバックします。

それらは正式にはDCL文ですが、データベースはトランザクションを処理する目的でDATABASEおよびSET SESSION文をDDL文として扱います。

ログオン始動文字列により実行される文 適用なし。 次の標準ルールに従わなければなりません。
  • トランザクション定義
  • トランザクションの終了
  • DDLリクエストの配置
ログオフ動作 作業をコミットする前にログオフした場合、システムはすべてのトランザクション リクエストをロールバックします。  
2フェーズ コミット(2PC) サポートしません。

Two-Phase Commit(2フェーズ コミット)は、分散データベース管理システム内の更新がトランザクション内のすべてのターゲット ノードを確実にコミットするか、すべてを確実にロールバックする方式です。

詳細については、<Teradata Vantage™ - Databaseの概要、B035-1091>を参照してください。

サポートします。

Two-Phase Commit(2フェーズ コミット)は、分散データベース管理システム内の更新がトランザクション内のすべてのターゲット ノードを確実にコミットするか、すべてを確実にロールバックする方式です。

詳細については、<Teradata Vantage™ - Databaseの概要、B035-1091>を参照してください。

ロック 最も排他的なロック(READ、WRITE、EXCLUSIVE)は、最も高いレベル(rowkey、rowhash、partition、tableなど)で保持され、トランザクションがコミットまたはロールバックされるまで解放されません。

データベースは、トランザクションの行ハッシュ ロックで使用される制御ブロック数を確認します。この数がDBS制御フィールドMaxRowHashBlocksPercentで設定されたしきい値を超えている場合は、このトランザクションをアボートします。詳細は、<Teradata Vantage™ - データベース ユーティリティ、B035-1102>を参照してください。

ロールバックされるリクエストに設定されたロックは、エラー応答のために解放されません。

最も排他的なロック(READ、WRITE、EXCLUSIVE)は、最も高いレベル(rowkey、rowhash、partition、tableなど)で保持され、トランザクションがコミットされるまで解放されません。

データベースは、トランザクションの行ハッシュ ロックで使用される制御ブロック数を確認します。この数がDBS制御フィールドMaxRowHashBlocksPercentで設定されたしきい値を超えている場合は、このトランザクションをアボートします。詳細は、<Teradata Vantage™ - データベース ユーティリティ、B035-1102>を参照してください。