Teradata Databaseは、デフォルトでロック レベルおよび重大度をSQLリクエストに割り当てます。
必要があれば、Teradata Databaseは、システム生成またはユーザー生成のトランザクションを処理している間に、ロックを格上げします。もっとも頻繁に生じるのは、READロックからWRITEロックへの格上げです。これは、ユーザーがある行を選択して、Teradata Databaseはトランザクションをコミットする前に同じ行に対して更新リクエストを行なうときに発生します。
デフォルトのロックの割当てについて
以下のテーブルは、さまざまなSQLリクエストとそのアクセス戦略向けの、いくつかのデフォルトのロック割り当てを示しています。
SQL文 | アクセス タイプ | 割り当てられるデフォルトのロックの種類 | |
---|---|---|---|
UPIまたはUSI | NUSIまたはFTS | ||
CREATE DATABASE DROP DATABASE MODIFY DATABASE |
適用なし | データベース | EXCLUSIVE |
CREATE TABLE DROP TABLE ALTER TABLE |
適用なし | テーブル | EXCLUSIVE |
DELETE | 行ハッシュ | テーブル | WRITE |
INSERT | 行ハッシュ | 適用なし | WRITE |
MERGE | 行ハッシュ |
|
WRITE |
SELECT | 行ハッシュ | テーブル | READ SELECT操作がDDL操作の一部である場合、システムは行ハッシュREADロックをACCESSロックに格下げしてブロッキングを回避することがあります。詳細については、DDL文とDCLリクエスト、ディクショナリのアクセス、ロックを参照してください。 |
SELECT AND CONSUME | 行ハッシュ | 行ハッシュ | WRITE リクエストが遅れるとキュー テーブルに行がないため、Teradata Databaseはロックを付与しません。テーブルに行が挿入されるとシステムは直ちにロックを付与し、トランザクションの処理が再開します。 |
UPDATE | 行ハッシュ | テーブル | WRITE |
ロード分離テーブル ロックのデフォルトは、標準のデフォルトと多少異なります。INSERT/DELETE/UPDATE/MERGE文を使用する非同時実行ロード分離変更は、読み取り側セッションでコミット済みの行の選択をブロックします。SQLを使用して実行される非同時実行ロード分離変更は、WRITEロックではなくEXCLUSIVEロックを使用します。
詳細は、ロード分離を参照してください。
LOCKINGリクエスト修飾子を使用したロック割当ての変更
割り当て済みのロックおよび個別のSQLリクエストに応じて、いくつかのデフォルトのロック割り当てをLOCKINGリクエスト修飾子を使用して変更できます(構文および使用方法について詳しくは、<Teradata Vantage™ SQLデータ操作言語、B035-1146>の「LOCKINGリクエスト修飾子」を参照してください)。重大度が低い任意のロックを重大度のより高いロックに格上げできますが、格下げはREADロックからACCESSロックのみが許可されています。
次のテーブルは、データベース ロックについて許可される変更のサマリーを示しています。
デフォルトで割り当てられた、変更前のロック | 変更後のユーザー指定のロック | 状態 |
---|---|---|
ACCESS CHECKSUMロックは本質的にACCESSロックと同一ですがCHECKSUMロックを明示的に指定できるのは、LOCKINGリクエスト修飾子を使用する場合のみです。このロックをより重大度の高いロックに格上げすることはできません。これは、Teradata DatabaseがCHECKSUMをデフォルトのロックの重大度として指定しないためです。 |
ACCESS | 冗長ではあるが、有効。 |
READ | READ | |
WRITE | WRITE | |
EXCLUSIVE | EXCLUSIVE | |
ACCESS | READ | 有効な格上げ。 |
WRITE | ||
EXCLUSIVE | ||
READ | WRITE | |
EXCLUSIVE | ||
WRITE | EXCLUSIVE | |
READ | ACCESS | 有効な格下げ。 |
以下のテーブルは、直前にある2つのテーブルの情報を組み合わせて、行ハッシュ、ビュー、およびテーブル データベース オブジェクトの各レベルにおける、個々のSQL DML文とロックの格上げと格下げの間の関係を示しています。
LOCKINGリクエスト修飾子の重大度 | 指定可能なSQL DML文 |
---|---|
EXCLUSIVE |
|
WRITE |
|
READ | SELECT |
ACCESS | SELECT |
DELETE、INSERT、MERGE、およびUPDATEリクエストでLOCKING FOR EXCLUSIVE修飾子しか指定できないのは、それらの文のデフォルトのロックの重大度がWRITEだからです。データベースの整合性を保てなくなるので、WRITEロックを格下げすることはできません。SELECT文はデータを更新することがないため、そのアクションがデータベースの整合性を危険にさらすことはありません。そのため、SELECT文のデフォルトのロックの重大度を他の任意の重大度に変更することが許可されています。このオプションは、SELECT AND CONSUME変形には拡張されません。その場合の重大度はWRITEまたはEXCLUSIVEにのみ格上げすることが可能です。
ロックの格上げのルール
- 2つのトランザクションが同じデータに対してREADロックを同時に保持していて、最初のトランザクションが更新リクエストに入った場合には、そのトランザクションのREADロックは、2番目のトランザクションのWRITEロックが解放されて初めて、WRITEロックに格上げされます。
- 最初のトランザクションがその更新リクエストに入ったときに、他のトランザクションが同じデータのロックを待っていた場合には、その待機中のトランザクションにロックが与えられる前に、最初のトランザクションのREADロックが格上げされます。したがって、すでに設定されているロックの格上げのほうが、新しいロックの許可よりも優先されます。
Query Sessionユーティリティを使用して、リクエストのブロックやトランザクションのアボートなど特定のセッションに関する操作の現行ステータスを判別できます(Query Sessionの使用方法の詳細について、<Teradata Vantage™ - データベース ユーティリティ、B035-1102>を参照してください)。
並列性を最大限にするための、デフォルトのロック割当の変更およびトランザクション内リクエスト オーダーの変更に関する指針
- アプリケーションがダーティ読み取りを許容する場合には常に、ACCESSロックをREADロックの代わりに使用します。
ただし、ロード分離テーブルがある場合は、LOAD COMMITTEDロッキング修飾子を使用して、ブロックされることなく、また同時実行分離変更をブロックすることなく、コミット済みの行を読み取ることができます。ロード分離テーブルを使用すると、ダーティ読み取りではなくコミット済み読み取りを取得することができます。ロード分離テーブルについての詳細は、ロード分離を参照してください。
- テーブルのREADロックを必要とするSELECTリクエストは、同じテーブルに対して実行中のCREATE INDEXまたはALTER TABLE…FALLBACKリクエストと並行して実行することはできません。
その代わりに、READロックをCREATE INDEXまたはALTER TABLEリクエストに指定して並列性を許可します(これを行なう方法については、<Teradata Vantage™ SQLデータ操作言語、B035-1146>の「LOCKINGリクエスト修飾子」を参照してください)。
- CREATE INDEXまたはALTER TABLE … FALLBACK LOCKINGのLOCKINGリクエスト修飾子にWRITEが指定されている場合(またはLOCKINGリクエスト修飾子が指定されていない場合)には、SELECTリクエストにLOCKINGリクエスト修飾子のACCESSロックを指定すれば並行処理を可能にすることができます(実行方法については、<Teradata Vantage™ SQLデータ操作言語、B035-1146>の「LOCKING」を参照)。
ALTER TABLE操作は、FALLBACKだけを追加するようにしかできないことに注意してください。 他のテーブル属性が追加された場合には、SELECTと並行して実行することはできません。
- WRITEロックのリクエストの結果として、トランザクションがブロックされたり、デッドロックが生じたりすることもあるため、ALTER TABLE…FALLBACK文またはCREATE INDEX文と並行して実行するときには、読取り専用のトランザクション(LOCKING FOR WRITE句を指定する場合はアクセス専用)の実行を考慮してください。これを行なう方法については、<Teradata Vantage™ SQLデータ操作言語、B035-1146>の「LOCKINGリクエスト修飾子」を参照してください。
- CREATE INDEXまたはALTER TABLE…FALLBACKと並行して長いトランザクションを実行するときには注意が必要です。CREATE INDEXリクエストやALTER TABLEリクエストは、長いトランザクションの実行が完了するまで完了しないことがあります。
- 他のDMLトランザクションまたはDDLリクエストによるデッドロックの発生を防止するためには、必要になる最高レベルのロックの重大度を即座に得られるようにDMLトランザクションを書き、トランザクション処理中に後からロックを格上げすることがないようにします。
- トランザクションの中のSELECT AND CONSUMEリクエストは常に可能な限り始めのほうに置き、他のデータベース リソースとの競合を回避する必要があります。これは、SELECT AND CONSUME TOP 1リクエストが、他のリクエストによって必要とされる可能性があるリソースのロックを保持したまま遅延状態になるという状況の可能性を最小限にするためです。