このトピックでは、Teradataセッション モードのトランザクションの意味に関するケース スタディについて説明します。ANSIセッション モード トランザクション処理のケース スタディも参照してください。
Teradataセッション モード トランザクションの失敗例
BTEQ -- Enter your DBC/SQL request or BTEQ command: BEGIN TRANSACTION; *** Begin transaction accepted. |
明示的なトランザクションの開始。 |
BTEQ -- Enter your DBC/SQL request or BTEQ command: INSERT INTO employee SELECT * FROM customer_service.employee; *** Insert completed. 26 rows added. |
単一のリクエスト。 WRITEロックが保持されます。 |
BTEQ -- Enter your DBC/SQL request or BTEQ command: SELECT * FRM employee WHERE empnum = 401; *** Failure 3706 Syntax error; SELECT * must have a FROM clause. |
無効な構文は失敗です。 トランザクションはロールバックします。 トランザクション内の以前のリクエストもすべてロールバックします。 すべてのロックは解放されます。 |
BTEQ -- Enter your DBC/SQL request or BTEQ command: SELECT * FROM employee; *** Query completed. No rows found. |
単一のリクエスト。 暗黙的なトランザクション |
BTEQ -- Enter your DBC/SQL request or BTEQ command: END TRANSACTION; *** Failure 3510 Too many END TRANSACTION statements. |
BEGIN TRANSACTIONリクエストで開始したトランザクションはすでにロールバックしているので、トランザクションを終了するリクエストは失敗応答を生じさせます。 |
Teradataセッション モードのリクエスト
DELETE FROM table_1 WHERE PI_col=2; INSERT INTO table_1 VALUES (2,3,4); UPDATE table_1 SET col_3=4; |
これらの3つの文は、別個のリクエストです。それらは、暗黙的なトランザクションでもあります。これは次の事柄を意味しています。
|
BEGIN TRANSACTION; DELETE FROM table_1 WHERE PI_col=2; INSERT INTO table_1 VALUES (2,3,4); UPDATE table_1 SET col_3=4; END TRANSACTION; |
これらの5つの文は単一の明示的なトランザクション内にある別個のリクエストです。これは次の事柄を意味しています。
|
DELETE FROM table_1 WHERE PI_col=2 ;INSERT INTO table_1 VALUES (2,3,4) ;UPDATE table_1 SET col_3=4; |
これらの3つの文は、単一の複文リクエストを形成します。それらは、暗黙的な単一のトランザクションでもあります。これは次の事柄を意味しています。
|
CREATE MACRO mac_1 AS ( DELETE FROM table_1 WHERE PI_col=2; INSERT INTO table_1 VALUES (2,3,4); UPDATE table_1 SET col_3=4; ); |
このマクロには、3つの異なるリクエストが含まれます。それらは同じマクロ内に含まれるので、同じ3つのリクエストを同じ順序で含む複文リクエストと動作が同じになります。 |
EXEC mac_1; |
このマクロの実行結果は、上記の対応する複文リクエストが分割不能であるのとまったく同じように分割不能です。 |
EXPLAIN EXEC mac_1 EXPLAIN DELETE FROM table_1 WHERE PI_col=2 ;INSERT INTO table_1 VALUES (2,3,4) ;UPDATE table_1 SET col_3=4; |
これらの2つのリクエストに対して生成されるEXPLAINレポートは、同じものになります。 |
複文リクエスト内でのDDL文とDML文の混在
Teradataセッション モードでは、同一のマクロまたは複文リクエスト内にDDL文とDML文を混在させることはできません。そのような要求を実行しようとすると、失敗応答が生じます。
例えば、次の複文リクエストはDML(2つのSELECTリクエスト)とDDL(CREATE TABLEリクエスト)が混在しているため失敗します。
SELECT * FROM table_1 ;SELECT * FROM table_1 ;CREATE TABLE table_33 ( col_1 INTEGER); *** Failure 3576 Data definition not valid unless solitary. Statement#1, Info =0
同等なマクロ テキストは、マクロを作成しようとした時点で同じ失敗という結果になります。
CREATE MACRO mac_1 AS ( SELECT * FROM table_1; SELECT * FROM table_1; CREATE TABLE table_33 ( col_1 INTEGER); ); *** Failure 3576 Data definition not valid unless solitary. Statement#1, Info =0
DDL文をTeradataセッション モードのトランザクション内に含める場合、それはトランザクション内の最後のアクション文でなければなりません。そうでない場合には、トランザクションは失敗してすべての作業がロールバックします。例えば、次のようになります。
BEGIN TRANSACTION; *** Begin transaction accepted. BTEQ -- Enter your DBC/SQL request or BTEQ command: CREATE TABLE table_19 ( col_1 INTEGER); *** Table has been created. BTEQ -- Enter your DBC/SQL request or BTEQ command: INSERT INTO table_3 VALUES (1); *** Failure 3932 Only an ET or null statement is legal after a DDL statement. BTEQ -- Enter your DBC/SQL request or BTEQ command: SHOW TABLE table_19; *** Failure 3807 Table/view/trigger/procedure ‘table_19’ does not exist.
異なるトランザクション構造に対するTeradataセッション モードのDELETEのパフォーマンス
DELETEリクエストを含むトランザクションを構造化する方法に応じて、テーブルから削除された行ごとに一時ジャーナルの項目を作成すること、またはトランザクション全体に対して1つだけ一時ジャーナルの項目を作成することができます。
次のDELETEリクエストは、単一の暗黙的なトランザクションです。削除される行ごとに一時ジャーナル項目が書き込まれるのではないため、そのパフォーマンスは優れています。
DELETE FROM table_1;
次の明示的なトランザクションは、DELETEリクエストに加えてBEGIN TRANSACTIONリクエストおよびEND TRANSACTIONリクエストだけを含みます。その構造のために、トランザクションは削除される行ごとに一時ジャーナル項目を書き込むので、特に大きな表ではパフォーマンスが低くなります。
BEGIN TRANSACTION; DELETE FROM table_1; END TRANSACTION;
次の複文リクエストには、直前のトランザクションと同じ3つのリクエストが含まれますが、それらが複文リクエストとしてパッケージ化されているので、暗黙的なトランザクションとして扱われます。Vantageはテーブルから削除される行ごとに一時ジャーナル項目を書き込むことはしないので、そのパフォーマンスは単一文の暗黙的なトランザクションのバージョンと同じになります。
BEGIN TRANSACTION ;DELETE FROM table_1 ;END TRANSACTION;
この最初のケースの場合、システムは次のリクエストが何であるか、またトランザクションのロールバックを準備する必要があることを把握しています。2つ目のケースの場合、システムは削除がコミットされることを確認することができ、そのためシステムはトランザクションをロールバックする必要がないことを把握しています。