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