17.00 - 17.05 - 2つの連続するトランザクションの例 - 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
日本語 (日本)

この例では2つのトランザクションを示します。最初のトランザクションは、2つ目のトランザクションの前に操作を開始します。

テーブル定義

次のテーブル定義があるとします。

     CREATE TABLE table_1 (
       column_1 INTEGER,
       column_2 INTEGER,
       column_3 INTEGER,
       column_4 INTEGER)
     PRIMARY INDEX (column_1);

問題のトランザクション

次の2つのトランザクションが並列に実行されています。最初のトランザクションは2番目のトランザクションに先立って開始します。

トランザクション

番号

SQLテキスト
1
LOCKING table_1 FOR READ
CREATE INDEX (column_3, column_4) ON table_1;
2
SELECT *
FROM table_1
WHERE column_3 = 124
AND column_4 = 93;

それぞれのトランザクションはテーブル レベルのREADロックをtable_1に設定します。これらのトランザクションは、table_1へのアクセス権を獲得して、同時に実行されます。

SELECTリクエストは、CREATE INDEXリクエストによって作成されているインデックスを認識しません。

問題の解決

並列性を除去するには、トランザクション1の明示的なロックがEXCLUSIVEになるようコーディングを変更します。

トランザクション

番号

SQLテキスト
1
LOCKING table_1 FOR EXCLUSIVE
CREATE INDEX (column_3, column_4) ON table_1;
2
SELECT *
FROM table_1
WHERE column_3 = 124
AND column_4 = 93;

トランザクション1の格上げされたLOCKING FOR EXCLUSIVE修飾子は、トランザクション2のtable_1に対するテーブル レベルのREADロック リクエストをブロックします。