17.00 - 17.05 - 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
日本語 (日本)

このトピックでは、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つの文は単一の明示的なトランザクション内にある別個のリクエストです。これは次の事柄を意味しています。
  • リクエストはトランザクションに指定された順序で連続して実行されます。
  • ロックはトランザクションの期間に渡って保持され、格上げされることもあります。ロックが解放されるのは、END TRANSACTION文が作業をコミットする場合か、ROLLBACK文、ABORT文、失敗、ログオフ、またはシステムの再始動が作業をロールバックする場合のいずれかだけです。
  • それぞれの成功または失敗は、他のものの成功または失敗に直接影響を与えます。
DELETE FROM table_1
WHERE PI_col=2
;INSERT INTO table_1
VALUES (2,3,4)
;UPDATE table_1
SET col_3=4;
これらの3つの文は、単一の複文リクエストを形成します。それらは、暗黙的な単一のトランザクションでもあります。これは次の事柄を意味しています。
  • トランザクションが保持する最も制限の大きなロックであるテーブル レベルのWRITEロックが、table_1に適用されます。
  • トランザクションによって行なわれる作業は分割不能です。つまり、すべてがコミットされるか、またはすべてがロールバックされるかのどちらかになります。
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つのリクエストが含まれますが、それらが複文リクエストとしてパッケージ化されているので、暗黙的なトランザクションとして扱われます。Teradata Databaseはテーブルから削除される行ごとに一時ジャーナル項目を書き込むことはしないので、そのパフォーマンスは単一文の暗黙的なトランザクションのバージョンと同じになります。

     BEGIN TRANSACTION
     ;DELETE FROM table_1
     ;END TRANSACTION;

この最初のケースの場合、システムは次のリクエストが何であるか、またトランザクションのロールバックを準備する必要があることを把握しています。2つ目のケースの場合、システムは削除がコミットされることを確認することができ、そのためシステムはトランザクションをロールバックする必要がないことを把握しています。