2つの連続するトランザクションの例 - Teradata Database - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQLリクエストおよびトランザクション処理

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Published
2019年3月
Language
日本語
Last Update
2019-10-29
dita:mapPath
ja-JP/arh1512079329802.ditamap
dita:ditavalPath
ja-JP/arh1512079329802.ditaval
dita:id
B035-1142
Product Category
Software
Teradata Vantage

この例では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ロック リクエストをブロックします。