17.00 - 17.05 - データベースのトランザクション - 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
日本語 (日本)

Vantageの処理はトランザクション ベースです。トランザクション管理の主な目的は、並列性を最適化することです。つまり、できるだけ多くのセッションが、データの一貫性や保全性を犠牲にしないで、データベース内の情報に同時にアクセスできるようにすることです。

データベース トランザクションの定義

トランザクションは、作業の単位および回復の単位の両方として扱われる、一連のnアクションです。なお、ここではその目的に沿って、主に作業の単位として見ていきます。
  • 作業の単位としてのトランザクションは、データベースに対して実行される一連のSQL操作を定義します。それらの操作は、全部実行されるか、まったく実行されないかのいずれかになります。これは、いわゆるトランザクションの原子性プロパティです。
  • 回復の単位として、トランザクションは、トランザクションを正常に完了できない場合に、その状態を以前の整合状態に戻すためにデータベースで実行される一連のロールバック操作を定義します。

トランザクションは、作業の単位および回復の単位という一般的な定義のほかに、それによってデータベースがある一貫した状態から別の一貫した状態に移行するので、一貫性の単位でもあります。一連の更新操作の最中に、データベース オブジェクトは新しく一貫性のある状態に変更されるので、一時的に不整合になることがあります。トランザクションは、一時的に不整合状態になる可能性がある中で一貫性を提供するために考案されました。一時的な不整合はすべて、トランザクション内に隔離される場合があり、他のユーザーからは認識されません。つまり、同じデータベース オブジェクトに関連した任意の2つの操作は、いずれかの順序で実行されるようにする必要があるということです。逐次性の定義を参照してください。

システムに障害が発生した場合、アーカイブ済みデータ、および永久ジャーナル内にオプションで記録された、データ基本テーブルの事前および事後行イメージを使用して、以前に実行された任意の数の操作をロールバックまたはロールフォワードすることによりデータベースを回復できます。詳細は、<Teradata® Archive/Recovery Utilityリファレンス、B035-2412>を参照してください。

Teradata SQLにおける文およびリクエストの定義

Teradata SQLのリクエストと文の定義を理解することは重要です。

リクエストは、作業の最小単位を説明するために使用される、Teradata固有の用語であり、単一のメッセージでクライアント システムからデータベースに送信されます。メッセージの構成要素の中には、以下のものがあります。
  • リクエスト レベルAPIオプション
  • 0以上のSQL文
  • リクエスト関連メタデータ
  • リクエスト関連データ

ANSI SQLではリクエストの概念は使用せず、作業の単位を定義しない、SQL文のみを指します。

どのSQL文でも単文リクエストでありえますが、すべてのリクエストがSQL単文とは限りません。

次のトピックでは、データベースでの文とリクエストの違いについて詳しく説明します。

Teradata SQLにおけるトランザクションの定義

Teradata SQLトランザクションの定義は、部分的に、そのトランザクションが実行されるセッション モードに依存します。

Teradataセッション モードでは、トランザクションは暗黙的にも明示的にもなります。ANSIセッション モードでは、ANSIトランザクションしかありません。

暗黙的トランザクションの定義

Teradataセッション モードで実行される各リクエストは、BEGIN TRANSACTION文によって優先されない限り、暗黙的トランザクションです。優先される場合、トランザクションは明示的になります。

Teradataセッション モードでは、暗黙トランザクションは単一のリクエストとみなされるために、最適化ルーチンは、リクエストを解析するときに、そのトランザクション全体 でどのようなロックが必要であるかを判別することができます。処理を開始する前に、最適化ルーチンはテーブルのロックを定められた方法で調整して、デッドロックを最小にすることができます。

ANSIセッション モードには、暗黙的トランザクションがありません。

明示的トランザクションの定義

また、BEGIN TRANSACTION文を使用してTeradataセッション モードでトランザクションを明示的に定義することもできます。

Teradataセッション モードの明示的なトランザクションは、以下のいずれかによって完了します。
  • END TRANSACTION文。
  • ABORT文またはROLLBACK文。
  • リクエストの失敗応答。
  • セッションがログオフされたとき(トランザクションをアボートします)。
  • システムが再始動したとき

BEGIN TRANSACTION文とEND TRANSACTION文は、ANSIセッション モードでは実行できません。そうしようとすると、データベースはリクエストをアボートし、要求元にエラーまたは失敗応答を返します。

構文解析プログラムはBEGIN TRANSACTION文を受け取ると、後続のSQL的テキスト内でSQL文のキーワードを直ちに検索します。これは、EXPLAIN、LOCKING、NONTEMPORAL、およびUSINGなどのリクエスト修飾子の配置を決定するときに注意してください。

例えば、明示的なトランザクションの最初のリクエストがUSINGリクエスト修飾子と関連付けられている場合、そのUSINGリクエスト修飾子はBEGIN TRANSACTIONリクエストの後に続くのではなく、このリクエストより先行する必要があります。言い換えると、USINGリクエスト修飾子はBEGIN TRANSACTIONの境界の外に指定する必要があります。

ANSIトランザクションの定義

ANSIセッション モードで、トランザクションは、リクエストが実行されて、未完了のトランザクションがない場合に開始されます。ANSIモード トランザクションは、次のいずれかによって完了します。
  • COMMIT文。
  • ABORT文またはROLLBACK文。
  • リクエストの失敗応答。
  • セッションがログオフされたとき(トランザクションをアボートします)。
  • システムが再始動したとき

COMMITリクエストはTeradataセッション モードでは実行できません。作成しようとすると、データベースはリクエストをアボートして要求元にエラーを返します。

明示トランザクションおよびANSIトランザクション用のロック

数個のリクエストが1つの明示またはANSIトランザクションとして実行依頼されたときは、それらのリクエストは、1つずつ処理されます。このことは、最適化ルーチンがトランザクション全体としてどのロックが必要になるかを判断する手段がないことを意味しています。

そのため、ロックは、各リクエストを受け取ったときに設定されます。ロックは、ユーザーがいつデータを受け取ったかにかかわらず、次のいずれかのイベントが完了するまでセッション モードによって保持されます。(例えば、トランザクションの終了後もスプールが存在することがあります。)
  • Teradataセッション モードでは、一番外側のEND TRANSACTION文。
  • ANSIセッション モードでは、COMMITまたはROLLBACK文の実行依頼

    ANSIセッション モードでは、すべてのトランザクションを明示的にコミットまたはロールバックする必要があります。そうしないと、ユーザーがトランザクションをコミットしたり、ロールバックするまで、すべてのトランザクションが継続します。

  • システムが再始動したとき

エラーと失敗

以下のテーブルは、システムがトランザクションをロールバックする条件について簡潔に説明しています。

応答コードのタイプ セッション モード 実行される処置
エラー ANSI エラーを生じるリクエストだけをロールバックします。

ロールバックされるリクエストのために付与されたロックは、解放しません。

Teradata 適用なし。

Teradataセッション モードでは、システムがエラー コードを返しません。その代わりに失敗コードが返されます。

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

システムはエラー生成リクエストのためにロールバックされたリクエストに設定されているロックを解放しないことに注意してください。そのようなロックはすべて、トランザクションがコミットされるか、ロールバックされるまで有効です。

エラーはANSIセッション モードのトランザクションを完了しませんが、失敗は完了することに注意してください。

トランザクションのACIDプロパティ

トランザクションの処理の一般概念は、いわゆるACIDプロパティに要約されます。ACIDとは、トランザクションの特色となっている、以下のプロパティ一式の略語です。
  • 原子性
  • 一貫性
  • 独立性
  • 耐久性

これらの表現のトランザクション特有の意味について、以下のテーブルで説明します。

用語 定義
原子性 トランザクションは、発生するかしないかのいずれかです。トランザクションの境界内にSQL操作コンポーネントがいくつ指定されているかに関係なく、それらはすべて正常に完了してコミットするか、あるいはそれらがすべて失敗してロールバックするかのいずれかになります。部分的なトランザクションというものはありません。

必ずしもこのプロパティにANSIトランザクションの意味が当てはまる必要はありません。

一貫性 トランザクションは、ある一貫したデータベース状態を別の一貫したデータベース状態に変換します。データベースが中間的な不整合状態になることはできません。
独立性 あらゆるトランザクションの操作は、そのトランザクションがコミットするまで、他のすべてのトランザクションから隠ぺいされます。実際には、トランザクションがこのプロパティを継承する必要はない場合があります。

分離レベルの定義を参照してください。

耐久性 一度コミットされると、基になるシステムがクラッシュしても、データベースの新しい一貫した状態は保たれます。

耐久性は、持続性と同義語です。

これら4つの要素は互いに独立した概念ではないのみならず、これらの概念の共有程度もそれぞれがかなり異なっていることも明白です。原子性と一貫性とはほとんど互いを巧みに言い直したものであり、そのどちらも独立性がなければ実現しません。

さらに、さまざまなACID保証の重要性は、トランザクションが読取り専用かまたは書込み操作も行なうかに依存します。例えば、読み取り専用トランザクションの場合、原子性および耐久性は無関係ですが、独立性はこれが正しいという理由から非常に重要です。

ANSIセッション モードでは、トランザクション内のリクエストがエラー応答を出して失敗したときにトランザクション全体ではなくそのリクエストだけがロールバックされるので、トランザクションに常に原子性があるとは限らないことに注意してください。トランザクションの残りのリクエストは、それがコミットまたはロールバックするまで続行します。

ロールバック トランザクションへの一時ジャーナルの使用

トランザクションはときどき失敗して直前の状態にロールバックする必要があるため、トランザクションの変更前の行セットを保持するメカニズムが存在する必要があります。トランザクションの変更前行イメージは、一時ジャーナルに保存されます。

何かの理由でトランザクションが失敗した場合、システムは、失敗したトランザクションによってアクセスされた行の変更前コピーを使用して、その更新をロールバックします。これは、適切な一時ジャーナルの変更前行を更新済みの変更後行に上書きすることによって行なわれます。