データベースのロックには、レベルと重大度という2つの次元があります。ロックのレベルは、ロックされたオブジェクトのタイプ、およびそれによって導かれるオブジェクトのサイズといったロックのスコープまたは粒度に関するものです。例えば、データベース ロックは、行キー レベル ロックよりも高く粒度の粗いレベルのロックです。
ロック粒度の選択は、常に同時並行性とオーバーヘッドという競合する需要の間でのトレードオフとなります。ロック レベルの選択が粒度のより詳細なものになると、同時並行性は向上します。行ハッシュまたはrowkey-levelのロックを実施すると、同じテーブルに対してテーブル レベルのロックを実施する場合よりも、より多くのユーザーが指定のテーブルにアクセスできるようになります。この理由で、Vantageは複数のレベルのロック粒度を提供しています。
ロックの重大度は、制限や排他の度合いに関するものです。例えば、WRITEロックはACCESSロックよりも制約が多く、EXCLUSIVEロックはREADロックよりも制約が多くなります。デフォルトのロックの割り当てとロックの格上げ可能性も参照してください。
ロック レベルについて
- データベース
- テーブル
テーブル レベルのロックの特別なカテゴリについて詳しくは、プロキシ ロックを参照してください。
- ビュー
- パーティション
- 行ハッシュ
- 行キー(パーティションおよび行ハッシュ)
ロック レベル | ロック対象 |
---|---|
データベース | 指定されたデータベース内の、すべてのテーブルのすべての行、およびそれらに関係したセカンダリ インデックス サブテーブル。 |
テーブル | 指定された基本テーブルのすべての行、および基本テーブルに関係したすべてのセカンダリ インデックス サブテーブルとフォールバック サブテーブルのすべての行。 |
ビュー | 指定されたビューによってアクセスされるすべての基礎テーブル。 |
パーティション | 指定されたテーブルまたは単一テーブル ビューの、パーティションの行のプライマリおよびフォールバック コピー。テーブルは行パーティション化されている必要があります。 このロックは、その他のユーザーが、同じパーティションにないテーブルのデータにアクセスすることを許可します。 |
パーティション範囲 | 特定のテーブルまたは単一テーブル ビューのパーティションの範囲における行のプライマリおよびフォールバック コピー。テーブルは行パーティション化されている必要があります。 このロックは、その他のユーザーが指定されたパーティション範囲外のテーブルにあるデータにアクセスすることを許可します。 |
行ハッシュ | 指定されたテーブルまたは単一テーブル ビューの同じ行ハッシュ値を共有する行の、指定されたプライマリまたはフォールバック コピー。行パーティション テーブルの場合、このロック レベルは全パーティションの行ハッシュ値に適用されます。 行ハッシュ レベル ロックは、その他のユーザーが同じ行ハッシュを持たないテーブルのデータにアクセスすることを許可します。 行ハッシュ レベルのロックは、同じハッシュ コードを共有する行の集合に適用されます。複数の行が同じ行ハッシュを持つことができるため、単一行のみをロックする必要はありません。
|
パーティション範囲における行ハッシュ | パーティションの範囲にある指定されたテーブルまたは単一テーブル ビューで同じ行ハッシュ値を共有する行の、指定されたプライマリまたはフォールバック コピー。テーブルは行パーティション化されている必要があります。 このロックは、その他のユーザーが、同じ行ハッシュを持たない、または指定されたパーティション範囲外にあるテーブルのその他のデータにアクセスすることを許可します。 行ハッシュ レベルのロックは、同じハッシュ コードを共有する行の集合に適用されます。同じパーティション、またはパーティション範囲の1つ以上のパーティションで、複数の行が同じ行ハッシュを持つ場合があるため、1つのみの行をロックする必要はありません。 このロック レベルは、USIやNUSIインデックス サブテーブルの行には使用されません。これらのサブテーブルがパーティション化されていることはないためです。 |
行キー | 指定されたテーブルまたは単一テーブル ビューの同じ行キー(パーティションおよび行ハッシュ値)を共有している行の、指定されたプライマリおよびフォールバック コピー。テーブルは行パーティション化されている必要があります。 行キー レベル ロックは、その他のユーザーが同じ行ハッシュまたはパーティション値を持たないテーブルにあるその他のデータにアクセスすることを許可します。 行キー レベル ロックは、同じパーティションおよび行ハッシュを共有する行の集合に適用されます。パーティションには同じ行ハッシュを持つ複数の行がある場合があるため、1つのみの行をロックする必要はありません。
|
ロック レベルによって、他のユーザーが目的のオブジェクトにアクセスできるかどうかが決まります。
ロックの重大度とロック レベルの組み合わせにより、様々なロックの粒度が設定されます。組み合わせの粒度が粗ければ粗いほど、並列性およびシステムのパフォーマンスに対する影響は増大し、処理時間の遅延は大きくなります。
ロックの重大度について
次のテーブルでは、利用できるロックの重大度を、制約の多い順に説明します。
ロックの重大度 | 説明 |
---|---|
最も制約の多い | |
EXCLUSIVE | EXCLUSIVEロックは、オブジェクトが構造的に変更されるとき(列が作成または削除されるときなど)に、データベースまたはテーブルにのみ掛けられます。 EXCLUSIVEロックは、LOCKINGリクエスト修飾子を使用して明示的に設定することもできます(<Teradata Vantage™ - SQLデータ操作言語、B035-1146>を参照してください)。 |
WRITE | INSERT、UPDATE、またはDELETEリクエストに対する応答として設定されます。 WRITEロックでは、他のユーザーによるアクセスが制限されます(ただし、データの一貫性を考慮する必要がなく、自動的に適用されるWRITEロックを、それより制限度の低いACCESSロックを指定することによってオーバーライドするアプリケーションは除く)。 このロックは、LOCKING修飾子を使用して明示的に設定することもできます(<Teradata Vantage™ - SQLデータ操作言語、B035-1146>を参照してください)。 |
READ | READロックは、SELECTリクエストへの応答として掛けられ、EXCLUSIVEまたはWRITEロックを必要とするユーザーによるアクセスを制限します。 同じリソースに対して、複数のユーザーがREADロックを設定することができます。このロックが設定されている間は、そのリソースを変更できません。READロックは、読み取り(SELECT文などの)操作の一貫性を保つために使用されます。 READロックは、LOCKINGリクエスト修飾子を使用して明示的に設定することもできます(<Teradata Vantage™ - SQLデータ操作言語、B035-1146>を参照してください)。 |
CHECKSUMロックおよびACCESSロックの重大度は、制限階層ではすべて同じレベルです。 | |
CHECKSUM | 埋め込みSQLでカーソルを使用しているときに、ユーザー定義のLOCKING FOR CHECKSUM修飾子(<Teradata Vantage™ - SQLデータ操作言語、B035-1146>を参照)に対して設定されます。 CHECKSUMロックは、ACCESSロックと同一ですが、カーソルを通して更新が行なわれているときに別のユーザーかセッションによってカーソル内の行が変更されているかどうかをテストできるように、スプールの行にチェックサムを追加する点は異なります。 カーソルのロック モード、<Teradata Vantage™ - SQLデータ操作言語、B035-1146>、および<Teradata Vantage™ - SQLストアド プロシージャおよび埋め込みSQL、B035-1148>も参照してください。 |
ACCESS | ユーザー定義のLOCKING FOR ACCESS修飾子(<Teradata Vantage™ - SQLデータ操作言語、B035-1146>を参照)に対する応答として、またはSET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL文(<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>を参照)を使用してセッションのデフォルト分離レベルをREAD UNCOMMITTEDにすることにより、設定されます。 すでにREADまたはWRITEロックされている可能性のあるオブジェクトへの読み取り形式のアクセスを許可します。ACCESSロックを取得しても、別のユーザーによるアクセスは制限されません(EXCLUSIVEロックが必要な場合を除く)。そのため、これはダーティーREADロックと呼ばれることがあります。 SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVELがREAD UNCOMMITEDに設定されている場合の読み取り操作のACCESSロックのグローバル適用は、DBS制御フィールドAccessLockForUncomReadの設定に依存します。 パラメータがFALSEに設定されている場合は、INSERT、DELETE、MERGE、およびUPDATEリクエスト内のSELECT操作がREADロックを設定しますが、パラメータがTRUEに設定されている場合は、同じSELECT操作がACCESSロックを設定します。 ACCESSロックを要求するユーザーは、データの整合性の問題をすべて無視することになります。ACCESSロックとWRITEロックには互換性があるため、アクセスを要求したユーザーがデータの読み取りを実行している間に、データの更新操作が進行するということがあり得ます。そのために、ACCESSロックを要求する問合わせが誤ったまたは矛盾した結果を返すことがあります。 ACCESSロックは、ユーザー定義LOAD COMMITTEDロッキング修飾子に対する応答としても掛けられます(<Teradata Vantage™ - SQLデータ操作言語、B035-1146>を参照)。 ISOLATED LOADINGのテーブル指定の詳細については、<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>を参照してください。 ロード分離テーブルの場合、この修飾子は、テーブルがデータをロードしている間でも、ユーザーがテーブルのコミット済み行から読み取ることを許可します。読み取られているテーブルがロード分離テーブルでない場合、この重大度ではACCESSロックが掛かります。 ロード分離の詳細については、ロード分離を参照してください。 |
最も制約の少ない |
ロックの重大度間の互換性
- ACCESS
- CHECKSUM
- READ
- WRITE
- EXCLUSIVE
以下の表記は、ロックの重大度の互換性について説明するために使用されます。
表記 | 定義 |
---|---|
Q | データベース オブジェクトと関連付けられたロック待ち行列。 |
L | 現在保持されているロックのリスト。 |
lock(<object>,<lock requested>) |
データベースのオブジェクトと、要求されたロックの重大度とのペア。 |
各データベース オブジェクトには、関連付けられたロック待ち行列Qおよび現行で設定されているロックのリストLがあります。すべてのリクエストは、どのデータベース オブジェクトにアクセスする場合でも、事前にロック操作を実行します。
lock(<object>,<lock requested>)の状態 | 結果 |
---|---|
L内の何らかのロックのために待ち行列に入れられる | トランザクションは、Qに置かれ、lock(<object>,<lock requested>)が待ち行列にある限り、そこで待機する。 この状態のリクエストは、ブロックされていると呼ばれます(ブロックされたリクエストを参照)。 |
付与される | lock(<object>,<lock requested>)が<lock requested>と共にLに追加され、トランザクションの処理が再開する。 |
あるオブジェクトのトランザクションがコミットまたはロールバックして終了すると、そのロックはLから除去されます。
次のページのテーブルでは、要求されたロックの重大度が既存のロックの重大度と衝突するときにとられる措置を要約しています。
要求されたロックの重大度 | 保持されているロックの重大度 | ||||
---|---|---|---|---|---|
None | ACCESS CHECKSUM | READ | WRITE | EXCLUSIVE | |
ACCESS CHECKSUM | ロックが付与される | ロックが付与される | ロックが付与される | ロックが付与される | リクエストが待ち行列に入れられる LOCKING FOR … NOWAITリクエスト修飾子を指定する場合、トランザクションは、待ち行列に入らずにブロックされると、アボートします。 |
READ | ロックが付与される | ロックが付与される | ロックが付与される | リクエストが待ち行列に入れられる LOCKING FOR NOWAITリクエスト修飾子を指定する場合、トランザクションは、待ち行列に入らずにブロックされると、アボートします。 |
リクエストが待ち行列に入れられる LOCKING FOR NOWAITリクエスト修飾子を指定する場合、トランザクションは、待ち行列に入らずにブロックされると、アボートします。 |
WRITE | ロックが付与される | ロックが付与される | リクエストが待ち行列に入れられる LOCKING FOR NOWAITリクエスト修飾子を指定する場合、トランザクションは、待ち行列に入らずにブロックされると、アボートします。 |
リクエストが待ち行列に入れられる LOCKING FOR NOWAITリクエスト修飾子を指定する場合、トランザクションは、待ち行列に入らずにブロックされると、アボートします。 |
リクエストが待ち行列に入れられる LOCKING FOR NOWAITリクエスト修飾子を指定する場合、トランザクションは、待ち行列に入らずにブロックされると、アボートします。 |
EXCLUSIVE | ロックが付与される | リクエストが待ち行列に入れられる LOCKING FOR NOWAITリクエスト修飾子を指定する場合、トランザクションは、待ち行列に入らずにブロックされると、アボートします。 |
リクエストが待ち行列に入れられる LOCKING FOR NOWAITリクエスト修飾子を指定する場合、トランザクションは、待ち行列に入らずにブロックされると、アボートします。 |
リクエストが待ち行列に入れられる LOCKING FOR NOWAITリクエスト修飾子を指定する場合、トランザクションは、待ち行列に入らずにブロックされると、アボートします。 |
リクエストが待ち行列に入れられる LOCKING FOR NOWAITリクエスト修飾子を指定する場合、トランザクションは、待ち行列に入らずにブロックされると、アボートします。 |
- Basic Teradata®Queryリファレンス、B035-2414
- Teradata® FastExportリファレンス、B035-2410
- Teradata® FastLoadリファレンス、B035-2411
- Teradata® MultiLoadリファレンス、B035-2409
- Teradata® Parallel Data Pumpリファレンス、B035-3021
- Teradata® Parallel Transporterリファレンス、B035-2436
待ち行列に入れられたリクエストは入出力待機の状態にあり、ブロックされていると呼ばれます(ブロックされたリクエストを参照)。
データベース、テーブル、またはビューにWRITEロックまたはEXCLUSIVEロックが設定されていると、ロックをかけているリクエストを除くすべてのリクエストまたはトランザクションは、そのオブジェクトのドメイン内にあるデータにアクセスすることが禁止されます。
データベース全体がロックされると大量のデータへのアクセスが制限されるため、構文解析プログラムは、並列性を最大限にすると同時にデータベースの整合性を守るために、必要な可能な限り最低のレベルおよび重大度でデフォルトのデータベース ロックが適用されるようにします。
ディクショナリ テーブルにテーブル レベルのWRITEロックが掛けられていると、競合しているタスク群がディクショナリにアクセスできなくなるため、構文解析プログラムは、できるだけ行ハッシュまたは行キー(パーティションおよび行ハッシュ)レベルでディクショナリ テーブルをロックしようと試みます。
ロード分離がロックの重大度間での互換性に影響する詳細については、ロード分離を参照してください。
SQL LOCKINGリクエスト修飾子のNOWAITオプションの使用
SQL LOCKINGリクエスト修飾子にNOWAITオプションを指定すると、Vantageは即時に実現できないロック リクエストを出すトランザクションをアボートします。NOWAITオプションをLOCKINGリクエスト修飾子とともに使用する方法の詳細については、<Teradata Vantage™ - SQLデータ操作言語、B035-1146>を参照してください。
Vantageはこのコードを少し変形したものを内部的に使用して、DDL操作がブロックされることを回避します。リクエストをアボートする代わりに、システムは行ハッシュ ロック重大度をREADからACCESSにダウングレードします。DDL文とDCLリクエスト、ディクショナリのアクセス、ロックを参照してください。
AMPベースのユーティリティとロギング
- ロック ビューアViewpointポートレット
このポートレットは、ブロックされたトランザクションやグローバル デッドロックを検出するために使用できる、さまざまなデータベースのロック遅延情報のレポートを作成します。Vantageは、さまざまなDBQLトランザクション ログから、ロック ビューア ポートレットがレポートしたデータを抽出します。