17.00 - 17.05 - Vantageのロック レベルと重大度 - 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
日本語 (日本)

データベースのロックには、レベルと重大度という2つの次元があります。ロックのレベルは、ロックされたオブジェクトのタイプ、およびそれによって導かれるオブジェクトのサイズといったロックのスコープまたは粒度に関するものです。例えば、データベース ロックは、行キー レベル ロックよりも高く粒度の粗いレベルのロックです。

ロック粒度の選択は、常に同時並行性とオーバーヘッドという競合する需要の間でのトレードオフとなります。ロック レベルの選択が粒度のより詳細なものになると、同時並行性は向上します。行ハッシュまたはrowkey-levelのロックを実施すると、同じテーブルに対してテーブル レベルのロックを実施する場合よりも、より多くのユーザーが指定のテーブルにアクセスできるようになります。この理由で、Vantageは複数のレベルのロック粒度を提供しています。

ロックの重大度は、制限や排他の度合いに関するものです。例えば、WRITEロックはACCESSロックよりも制約が多く、EXCLUSIVEロックはREADロックよりも制約が多くなります。デフォルトのロックの割り当てとロックの格上げ可能性も参照してください。

ロック レベルについて

データベース管理システムのロック レベルの階層は、使用可能なロックの粒度に応じて決まります。データベース レベルのロックは粒度が最も粗く、行キー レベルのロックは粒度が最も細かくなります。処理されるリクエストの種類に応じて、システムはリクエスト対象のオブジェクト(次に挙げるデータベース オブジェクトのいずれか1つ)に、特定のデフォルトのロック レベルを設定します。
  • データベース
  • テーブル

    テーブル レベルのロックの特別なカテゴリについて詳しくは、プロキシ ロックを参照してください。

  • ビュー
  • パーティション
  • 行ハッシュ
  • 行キー(パーティションおよび行ハッシュ)
ロック レベル ロック対象
データベース 指定されたデータベース内の、すべてのテーブルのすべての行、およびそれらに関係したセカンダリ インデックス サブテーブル。
テーブル 指定された基本テーブルのすべての行、および基本テーブルに関係したすべてのセカンダリ インデックス サブテーブルとフォールバック サブテーブルのすべての行。
ビュー 指定されたビューによってアクセスされるすべての基礎テーブル。
パーティション 指定されたテーブルまたは単一テーブル ビューの、パーティションの行のプライマリおよびフォールバック コピー。テーブルは行パーティション化されている必要があります。

このロックは、その他のユーザーが、同じパーティションにないテーブルのデータにアクセスすることを許可します。

パーティション範囲 特定のテーブルまたは単一テーブル ビューのパーティションの範囲における行のプライマリおよびフォールバック コピー。テーブルは行パーティション化されている必要があります。

このロックは、その他のユーザーが指定されたパーティション範囲外のテーブルにあるデータにアクセスすることを許可します。

行ハッシュ 指定されたテーブルまたは単一テーブル ビューの同じ行ハッシュ値を共有する行の、指定されたプライマリまたはフォールバック コピー。行パーティション テーブルの場合、このロック レベルは全パーティションの行ハッシュ値に適用されます。

行ハッシュ レベル ロックは、その他のユーザーが同じ行ハッシュを持たないテーブルのデータにアクセスすることを許可します。

行ハッシュ レベルのロックは、同じハッシュ コードを共有する行の集合に適用されます。複数の行が同じ行ハッシュを持つことができるため、単一行のみをロックする必要はありません。
  • 行ハッシュ レベル ロックは、非行パーティション テーブルが固有プライマリ インデックス(UPI)または非固有プライマリ インデックス(NUPI)を使用してアクセスされる場合に適用されます。
  • 固有セカンダリ インデックス(USI)を使用してデータ行にアクセスする更新や削除の場合、インデックス データ行ハッシュまたは行キーに加えて、USIサブテーブルの適切な行ハッシュがロックされます。
  • テーブルの非固有セカンダリ インデックス(NUSI)の行ハッシュ ロックサブテーブルは、通常必要ありません。まず、NUSIアクセス パスを使用する問合わせまたはDMLは、テーブル全体をロックします。次に、テーブル全体をロックしないDMLは、インデックスのメンテナンスを必要とするNUSIサブテーブルには、行ハッシュ ロックではなく、タスク ロックを使用します。
パーティション範囲における行ハッシュ パーティションの範囲にある指定されたテーブルまたは単一テーブル ビューで同じ行ハッシュ値を共有する行の、指定されたプライマリまたはフォールバック コピー。テーブルは行パーティション化されている必要があります。

このロックは、その他のユーザーが、同じ行ハッシュを持たない、または指定されたパーティション範囲外にあるテーブルのその他のデータにアクセスすることを許可します。

行ハッシュ レベルのロックは、同じハッシュ コードを共有する行の集合に適用されます。同じパーティション、またはパーティション範囲の1つ以上のパーティションで、複数の行が同じ行ハッシュを持つ場合があるため、1つのみの行をロックする必要はありません。

このロック レベルは、USIやNUSIインデックス サブテーブルの行には使用されません。これらのサブテーブルがパーティション化されていることはないためです。

行キー 指定されたテーブルまたは単一テーブル ビューの同じ行キー(パーティションおよび行ハッシュ値)を共有している行の、指定されたプライマリおよびフォールバック コピー。テーブルは行パーティション化されている必要があります。

行キー レベル ロックは、その他のユーザーが同じ行ハッシュまたはパーティション値を持たないテーブルにあるその他のデータにアクセスすることを許可します。

行キー レベル ロックは、同じパーティションおよび行ハッシュを共有する行の集合に適用されます。パーティションには同じ行ハッシュを持つ複数の行がある場合があるため、1つのみの行をロックする必要はありません。
  • 行キー レベル ロックは、プライマリ インデックスおよびパーティション列値を指定することによりプライマリ インデックス(UPIまたはNUPI)を持つ行パーティション テーブルがアクセスされる場合に適用されます。
  • 行キー レベル ロックは、USIやNUSIサブテーブルの行に適用されません。これらのサブテーブルがパーティション化されることはないためです。

ロック レベルによって、他のユーザーが目的のオブジェクトにアクセスできるかどうかが決まります。

ロックの重大度とロック レベルの組み合わせにより、様々なロックの粒度が設定されます。組み合わせの粒度が粗ければ粗いほど、並列性およびシステムのパフォーマンスに対する影響は増大し、処理時間の遅延は大きくなります。

ロックの重大度について

次のテーブルでは、利用できるロックの重大度を、制約の多い順に説明します。
Host Utility(HUT)ロックは、Archive/Recoveryユーティリティおよび関連するさまざまなコマンドによって設定されるロックです。HUTロックはこのテーブルには含まれません。HUTロックの情報については、<Teradata® Archive/Recovery Utilityリファレンス、B035-2412>を参照してください。
ロックの重大度 説明
最も制約の多い
EXCLUSIVE EXCLUSIVEロックは、オブジェクトが構造的に変更されるとき(列が作成または削除されるときなど)に、データベースまたはテーブルにのみ掛けられます。

EXCLUSIVEロックは、LOCKINGリクエスト修飾子を使用して明示的に設定することもできます(<Teradata Vantage™ - SQLデータ操作言語、B035-1146>の「LOCKINGリクエスト修飾子」を参照してください)。

WRITE INSERT、UPDATE、またはDELETEリクエストに対する応答として設定されます。

WRITEロックでは、他のユーザーによるアクセスが制限されます(ただし、データの一貫性を考慮する必要がなく、自動的に適用されるWRITEロックを、それより制限度の低いACCESSロックを指定することによってオーバーライドするアプリケーションは除く)。

このロックは、LOCKING修飾子を使用して明示的に設定することもできます(<Teradata Vantage™ - SQLデータ操作言語、B035-1146>の「LOCKINGリクエスト修飾子」を参照してください)。

READ READロックは、SELECTリクエストへの応答として掛けられ、EXCLUSIVEまたはWRITEロックを必要とするユーザーによるアクセスを制限します。

同じリソースに対して、複数のユーザーがREADロックを設定することができます。このロックが設定されている間は、そのリソースを変更できません。READロックは、読み取り(SELECT文などの)操作の一貫性を保つために使用されます。

READロックは、LOCKINGリクエスト修飾子を使用して明示的に設定することもできます(<Teradata Vantage™ - SQLデータ操作言語、B035-1146>の「LOCKINGリクエスト修飾子」を参照してください)。

CHECKSUMロックおよびACCESSロックの重大度は、制限階層ではすべて同じレベルです。
CHECKSUM 埋め込みSQLでカーソルを使用しているときに、ユーザー定義のLOCKING FOR CHECKSUM修飾子(<Teradata Vantage™ - SQLデータ操作言語、B035-1146>の「LOCKINGリクエスト修飾子」を参照)に対して設定されます。

CHECKSUMロックは、ACCESSロックと同一ですが、カーソルを通して更新が行なわれているときに別のユーザーかセッションによってカーソル内の行が変更されているかどうかをテストできるように、スプールの行にチェックサムを追加する点は異なります。

カーソルのロック モード、<Teradata Vantage™ - SQLデータ操作言語、B035-1146>、および<Teradata Vantage™ - SQLストアド プロシージャおよび埋め込みSQL、B035-1148>も参照してください。

ACCESS ユーザー定義のLOCKING FOR ACCESS修飾子(<Teradata Vantage™ - SQLデータ操作言語、B035-1146>の「LOCKINGリクエスト修飾子」を参照)に対する応答として、または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>の「USINGリクエスト修飾子」を参照してください。

ISOLATED LOADINGのテーブル指定の詳細については、<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>を参照してください。

ロード分離テーブルの場合、この修飾子は、テーブルがデータをロードしている間でも、ユーザーがテーブルのコミット済み行から読み取ることを許可します。読み取られているテーブルがロード分離テーブルでない場合、この重大度ではACCESSロックが掛かります。

ロード分離の詳細については、ロード分離を参照してください。

最も制約の少ない

ロックの重大度間の互換性

Teradataロック マネージャは、特定のレベルに設定された場合に、以下のタイプの相互作用を制御します。
  • ACCESS
  • CHECKSUM
  • READ
  • WRITE
  • EXCLUSIVE

HUTロックの情報については、<Teradata® Archive/Recovery Utilityリファレンス、B035-2412>を参照してください。

以下の表記は、ロックの重大度の互換性について説明するために使用されます。

表記 定義
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リクエスト修飾子を指定する場合、トランザクションは、待ち行列に入らずにブロックされると、アボートします。

BTEQ、FastExport、FastLoad、MultiLoad、Teradata Parallel Data Pump、Teradata Parallel Transporterなどの他のクライアント ユーティリティが標準的なデータベース ロックを使用するため、これらのロックの重大度の、他のデータベース ロックの重大度との相互作用は同じです。これらのユーティリティによって設定されるロックの詳細については、以下のマニュアルを参照してください。
  • 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オプションを指定すると、Teradata Databaseは即時に実現できないロック リクエストを出すトランザクションをアボートします。NOWAITオプションをLOCKINGリクエスト修飾子とともに使用する方法の詳細については、<Teradata Vantage™ - SQLデータ操作言語、B035-1146>のLOCKINGリクエスト修飾子を参照してください。

Teradata Databaseはこのコードを少し変形したものを内部的に使用して、DDL操作がブロックされることを回避します。リクエストをアボートする代わりに、システムは行ハッシュ ロック重大度をREADからACCESSにダウングレードします。DDL文とDCLリクエスト、ディクショナリのアクセス、ロックを参照してください。

AMPベースのユーティリティとロギング

以下に、ロギングに関連するユーティリティを示します。
  • ロック ビューアViewpointポートレット

    このポートレットは、ブロックされたトランザクションやグローバル デッドロックを検出するために使用できる、さまざまなデータベースのロック遅延情報のレポートを作成します。Teradata Databaseは、さまざまなDBQLトランザクション ログから、ロック ビューア ポートレットがレポートしたデータを抽出します。

  • Show Lock

    このユーティリティは、さまざまなホスト ユーティリティ(HUT)ロックのレポートを作成します。HUTロックの詳細については、<Teradata® Archive/Recovery Utilityリファレンス、B035-2412>を参照してください。