17.00 - 17.05 - デフォルトのロックの割り当てとロックの格上げ可能性 - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
ユーザー ガイド
Publication ID
B035-1142-170K-JPN
Language
日本語 (日本)

Teradata Databaseは、デフォルトでロック レベルおよび重大度をSQLリクエストに割り当てます。

必要があれば、Teradata Databaseは、システム生成またはユーザー生成のトランザクションを処理している間に、ロックを格上げします。もっとも頻繁に生じるのは、READロックからWRITEロックへの格上げです。これは、ユーザーがある行を選択して、Teradata Databaseはトランザクションをコミットする前に同じ行に対して更新リクエストを行なうときに発生します。

ロード分離テーブルの場合、同時実行ロード分離変更にはWRITEロックが使用され、非同時実行ロード分離変更にはEXCLUSIVEロックが使用されます。同時実行および非同時実行ロード分離変更の詳細については、ロード分離を参照してください。

デフォルトのロックの割当てについて

以下のテーブルは、さまざまな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 行ハッシュ
  • INSERTの場合は適用なし
  • UPDATEのテーブル
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
  • DELETE
  • INSERT
  • MERGE
  • SELECT
  • UPDATE
WRITE
  • SELECT
  • SELECT AND CONSUME
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リクエストが、他のリクエストによって必要とされる可能性があるリソースのロックを保持したまま遅延状態になるという状況の可能性を最小限にするためです。