次のトピックでは、データベースが文、リクエストおよびトランザクションを処理する方法について説明します。
文の処理
- 一定レベルの隔離を確保するために、アクセス先のデータベース オブジェクトに対するロックが必要です。
デ-タベ-ス ロック、2フェーズ ロック、および逐次性を参照してください。
- リクエストとして個々に実行することができます。
この場合、SQL文はTeradataリクエストと機能的に同等です。
状況に応じて、SQL文はデータベース トランザクションと機能的に同等になることもあります。
- 単文リクエストまたは複文リクエストの構成要素として実行することができます。
状況に応じて、複文リクエストはデータベース トランザクションと機能的に同等になることもあります。
- マクロの構成要素になる可能性があります。
- SQLプロシージャの構成要素である場合があります。
リクエスト処理
リクエストは、ゼロ以上のSQL文とその他の情報で構成されます。1つ以上のSQL文が含まれるリクエストを複文リクエストといいます。1つのSQL文を持つリクエストは、単文リクエストと呼ばれます。
リクエストはデータベースに送信されます。それは処理され、応答が返されます。その後に、別のリクエストを送信することができます。
- SQL文の構文検査(構文解析ルーチンを参照)。
- SQL文の構文注釈(Resolverを参照)。
- 権限の検査(セキュリティ チェックを参照)。
- リクエストの最適化(最適化ルーチンおよびクエリー リライト、統計、および最適化を参照)。
リクエストのSQL文によって必要とされる最も拘束力のあるロックは、可能な限り早く取得されます。これは、2フェーズ ロック プロトコルに重要です(デ-タベ-ス ロック、2フェーズ ロック、および逐次性を参照)。ロックがリクエストやトランザクション内で解放されることはありません。それらは、トランザクションが完了したときに解放されます。
例えば、以下のような複文リクエストを考えてみます。
SELECT FROM employee ; UPDATE employee SET salary_amount = salary_amount * 1.1;
この複文リクエストのSELECT文にはREADロックだけが必要ですが、UPDATE文にはWRITEロックが必要です。WRITEロックがこの複文リクエストに必要な最も制限の大きいロックなので、このシステムは、複文リクエストのSELECT文とUPDATE文の構成要素に対する複文リクエストに適用します。
複文リクエストの処理
Teradataリクエストは、行末のセミコロン記号で終了します。リクエスト内の他の場所に置かれたセミコロンは、そのリクエストを終了しません。
この特性を使用して、続く行の先頭または行の途中にセミコロンを置くことにより、複数のSQL文を単一のリクエスト内に指定することができます。
例えば、以下のリクエストはどちらも有効な複文リクエストです。
SELECT * FROM employee; UPDATE employee SET salary_amount=salary_amount * 1.1; SELECT * FROM employee ;UPDATE employee SET salary_amount=salary_amount * 1.1;
- DML文だけを含めることができます。
DCLおよびDDL文は、複文リクエストの構成要素にはなりません。
この特性は、複文リクエストとマクロを区別します。マクロでは、リクエストの最後の文であれば単一のDDL文を含めることができます。
- CALL文を含めることはできません。
CALLは、複文リクエストで許可されていないDML文です。
- データベースは、複文リクエスト内の文を依存関係に注意しながら指定された順序で実行します。
- リクエスト内の個別の文で必要とされる最も制限の大きいロックが、リクエストとトランザクション全体に対して保持されます。
- 複文INSERTリクエストは例外ですが、複文リクエストの結果はTeradataセッション モードのトランザクションの結果と同じようにオール オア ナッシングです。
リクエスト内の文の1つが失敗した場合、リクエスト全体が失敗してデータベースはトランザクションをロールバックします。
文の独立性を使用する複文INSERTリクエストの場合は、失敗したこれらの文のみがロールバックされ、複文リクエストの成功した文はコミットされます。
クライアントAPIが文の独立性をサポートするかどうかを判別するには、該当するTeradata Tools and Utilitiesのマニュアルを参照してください。
文の独立性の詳細については、<Teradata Vantage™ - SQLデータ操作言語、B035-1146> の「INSERT/INSERT … SELECT」を参照してください。
- 複文リクエストは、Teradataセッション モードの行端を示すセミコロン文字によって暗黙的に、あるいはANSIセッション モードのCOMMITリクエストで明示的に、またはTeradataセッション モードのEND TRANSACTIONリクエストによってコミットできます。
BEGIN TRANSACTIONリクエストで開始された明示的なトランザクションを終了するために実行できるのは、END TRANSACTIONリクエストのみです。詳細については、<Teradata Vantage™ - SQLデータ操作言語、B035-1146>のBEGIN TRANSACTIONおよびEND TRANSACTIONを参照してください。
トランザクションの処理
最も一般的に使用されるトランザクションの例は、銀行ATMの貸借トランザクションです。例えば、当座預金口座から10ドルを引き出して、それを普通預金口座に入金するとします。これは2つの部分からなるトランザクションです。つまり、当座預金口座からの資金の引き出し(借方フェーズ)、および普通預金口座への入金(貸方フェーズ)です。これは非常に簡略化した例です。従来の借方/貸方トランザクションには多数の構成要素がありますが、ユーザーの視点からは、これは1つの口座から資金を引き出して別の口座に入金することです。
トランザクションの借方フェーズが正常に完了して、貸方フェーズが正常に完了しなかったとします。10ドルは、単に消失してしまうのでしょうか。適切なトランザクション管理がなければ、消失してしまうことになります。ここに示したシナリオでは、貸方が失敗したとき、システムは引き出し操作をロールバックするので、資金は消失しません。このトランザクションはオール オア ナッシングなので、分割不能です。作業のサブセットだけを実行することはできません。
操作がTeradataモードでもANSIモードでも、暗黙的でも明示的でも、文およびリクエストの処理は本質的に同じです。2つのモードを互いに区別するのは、変更が適用される条件です。
データに対する変更をコミットまたはロールバックする操作が、トランザクション処理を構成します。