DML SELECTにより、セッション分離レベル(以下のテーブルを参照)およびLock Managerが課すロック レベルまたはLOCKING修飾子を使用して指定するロック レベルに基づいて、SELECT文で参照されるテーブルまたは行にデフォルトでREADロックがかけられます。LOCKINGリクエスト修飾子を参照してください。SELECT文でビューを参照する場合には、基礎となるテーブルごとにREADロックが設定されます。
外側のSELECT文およびSELECTサブクエリーが、DELETE、INSERT、MERGE、またはUPDATE文を使ってデータを操作するDML文内にネストされていない場合、セッション トランザクションの分離レベルがSERIALIZABLEであっても、デフォルト値のロック重大度は常にREADです。
セッション トランザクションの分離レベルがREAD UNCOMMITTEDで、DBS制御フィールドAccessLockForUncomReadがTRUEに設定されている場合、SELECT操作のデフォルト値のロック レベルは、以下の段落とテーブルで説明する要因によって決まります。
以下のテーブルに示すように、SELECTサブクエリーが、DELETE、INSERT、MERGE、またはUPDATE文を使ってデータを操作するDML文内にネストされている場合、DBS制御フィールドAccessLockForUncomReadがTRUEで、そのセッションのトランザクションの分離レベルがREAD UNCOMMITTEDならば、デフォルト値のロック重大度はACCESSです。
トランザクションの分離レベル | DBS制御AccessLockForUncomReadフィールド設定 | 外部SELECTと通常のSELECTサブクエリー操作におけるデフォルト値のロック重大度 | DELETE、INSERT、MERGE、UPDATEの各文に埋め込まれたSELECT操作におけるデフォルト値のロック重大度 |
---|---|---|---|
SERIALIZABLE | FALSE | READ | READ |
TRUE | READ | ||
READ UNCOMMITTED | FALSE | READ | |
TRUE | ACCESS |
SELECT文ではLOCKING修飾子を指定せずに、テーブルのアクセスに使用するビューでLOCKING修飾子を指定すると、Teradata Databaseはビューで指定したロックを設定し、上のテーブルで説明したデフォルト値には従いません。
例えば、以下のビューを作成すると仮定します。
CREATE VIEW access_view (a, b) AS LOCKING TABLE accntrec FOR ACCESS SELECT accntno, qualifyaccnt FROM accntrec WHERE qualifyaccnt = 1587;
指定されたセッション分離レベルおよびAccessLockForUncomReadフィールドの設定に関係なく、このSELECT文によりaccntrecテーブルにはACCESSロックが設定されます。
SELECT a, b FROM access_view;
詳細については、<Teradata Vantage™ SQLデータ定義言語 - 構文規則および例、B035-1144>の「SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL」を参照してください。