次の例は、同時並行性を最適化する方法を示しています。
例のテーブル定義
次のテーブル定義を想定します。
CREATE TABLE table_1 ( column_1 INTEGER, column_2 INTEGER) PRIMARY INDEX (column_1);
例の問題トランザクション
次の並列に実行するトランザクションを考えてみます。
トランザクション番号 | SQLテキスト |
---|---|
1 | LOCKING table_1 FOR READ ALTER TABLE table_1, FALLBACK; |
2 | SELECT * FROM table_1; |
デッドロックのないトランザクション処理
以下のステップが、この順序で実行されることを想定します。
- トランザクション1は、テーブル レベルのREADロックをtable_1に設定します。
- トランザクション2も、テーブル レベルのREADロックをtable_1に設定します。
- これらのトランザクションが両方ともtable_1にアクセスし、並行して実行されます。
- トランザクション1は、トランザクション2のSELECTリクエストと並行してフォールバックを構築しますが、2番目のトランザクションが完了してtable_1のロックを解放するまでは完了しません。次に、トランザクション1はそのロックをEXCLUSIVEに格上げしてALTERを完了します。