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-1147-170K-JPN
Language
日本語 (日本)

この関数は、同時に複数の外部ルーチンにより共有される読み取り/書き込みGLOPに使用します。GLOPが共有されているかどうかは判別できないので、最善の方法は、ロックを常時使用することです。ロックを使用しないのは、データの設計がそれを必要としない場合のみとします。例えば、すべての外部ルーチンがその固有のアドレス範囲にアクセスするため、別の外部ルーチンが同時にデータを使用できる可能性がないような方法でデータを分割する設計であれば、ロックを使用しなくても構いません。(ただしこのシナリオはほとんどありえません。)例えば、GLOPデータが毎日12 AMちょうどにメモリ内で更新される場合、すべての外部ルーチンは、時刻が12 AM近くでなければ読み取りロックの設定を無視することができます。いずれにしても、どの使用の設計においてもこの問題は考慮される必要があります。

READロックは複数が許可され、WRITEロックは1つだけが許可されます。すべてのロック要求には、130秒のタイムアウトが関連付けられています。ロック リクエストを130秒以内に許可できない場合、関数は値-2を戻します。呼び出し側はそれを検査し、リクエストを再適用するか、または別の動作に移行する必要があります。このようにする理由は、永続的なデッドロックを回避するためです。外部ルーチンはいつでも、アボートするかまたは再試行することを決定できます。また、許可されるどのロックも、タイムアウトは2分になります。このデフォルトは、構成パラメータで変更することができます。GLOPが2分を超えてロックされていると、システムはトランザクションをアボートします。設定されているロックで外部ルーチンが終了する場合、システムはトランザクションをアボートします。これは、期間を延長して外部ルーチン コードがメモリをロックしないようにするために実行されます。これにより、グローバル デッドロックの問題を解決しようとして、データベースに複雑なコードを追加することを避けられます。タイムアウトがあれば、ロック中のGLOPの効率的な使用も促進されます。ロック コマンドは、読み取り/書き込みデータだけと関係します。読み取り専用データをロックすることには意味がなく、それは許可されていません。

これは自己管理システムです。外部ルーチンは、ロックなしでいつでもメモリを(読み取り/書き込みであれば)変更できます。さらにこれは、ロックなしでメモリを読み取ることができます。ただし、外部ルーチンで、それを実行することに意味があるかどうか、および他の外部ルーチンに対して問題を引き起こす可能性がないかどうかが把握されている必要があります。

読み取り/書き込みGLOPが例えばロックが必要とされないリクエスト レベルでマップされているとか、リクエストに並行するステップがある場合には必ずしも該当しないなどということは、ロック不要の理由として考慮しないでください。その場合にも引き続き、競合を避けるためにロックを必要とします。