ロックのタイムアウトのタイプ
SQLトランザクションが別のプロセスからロックが入力されるのを待つ場合、タイムアウトを設定する方法は2つあります。次の2つの方法です。
1 (Linux上ではなく) Windows および IBM i 上 でサポートされた接続ロックのタイムアウトはすべてのLANSA開発データベースに設定できます。SQLサーバー、OracleおよびSybase Adaptive Server Anywhereは、各接続ごとにタイムアウトを設定し、その接続上で発生するすべてのロックがコントロールをアプリケーションに返せるようにします。
2 Linux上のOracleについては、別のテクニックが必要です。この環境において、待ち時間はLANSAが更新または削除を実行する前に選択上で設定できます。これはステートメント・ロックのタイムアウトと呼ばれます。LANSAは、Windows対応のOracle上でのこの設定もサポートするため、アプリケーションが、WindowsまたはLinuxのどちらで実行される場合でも、一貫したタイムアウト・ふるまいを期待することができます。
接続ロックのタイムアウトには、タイムアウトまでの待ち時間を、X_DBMENV.DAT内でLOCK_TIMEOUTで設定することが必要です。ゼロ値は永久に待たなければならないことを表示し、LANSAはタイムアウト・エラーをトラップできません。これは、下位互換性のために用意されています。省略値はゼロです。計測の単位は、データベースのタイプによって異なります。これは X_DBMENV.DAT内のコメントで言及されています。例えば、SQLサーバーはミリ秒単位でのタイムアウトの指定を要求し、MySQLは秒単位での指定を要求します。
あわせて、LOCK_TYPE=C (省略値) も設定します。
Oracleでは、Windowsディレクトリの ORAODBC.INIファイル内で値を設定することも必要です。これは通常c:\windowsですが、set windirを入力することにより、実際の値を設定することができます。
ロックのタイムアウトを設定する際、ORAODBC.INI 内に以下のようなテキストがあることを確認してください。
[Oracle ODBC Driver Common]LockTimeOut=2Oracleでは、X_DBMENVf.DAT 内の値はLANSAのロックのタイムアウトのふるまいのみを有効にし、実際にタイムアウト値を設定しないことに注意してください。返されるエラー・コードは、ロックの実行に選択された方法によって異なります。
DBMS_RETCODE_ROW_LOCKED=1013
X_DBMENV.DAT内でのOracle設定のフル・セットは次の通りです。
LOCK_TYPE=C
LOCK_TIMEOUT=2
CMD_LOCK_TIMEOUT=<setting ignored>
DBMS_RETCODE_ROW_LOCKED=1013
ステートメント・ロックのタイムアウトはOracle固有のタイムアウトです。WindowsとLinux Oracle上で、同じロックのタイムアウトのふるまいを可能にします。
このタイムアウトでは、X_DBMENV.DAT内で LOCK_TIMEOUTをゼロ以外の値に設定し、LANSAの機能を有効化することも必要ですが、実際にタイムアウト値は設定しません。あわせて LOCK_TYPE=Sも設定します。
ロックが発生した場合、ロックの開放を待つか、またはまったく待たないかについても選択します。これは、CMD_LOCK_TIMEOUT内で設定します。それぞれ、"FOR UPDATE WAIT n" または "FOR UPDATE NOWAIT" です。
最後に、タイムアウト設定とあわせるために、エラー・コード (DBMS_RETCODE_ROW_LOCKED ) を次のように設定する必要があります。
例えばロックのタイムアウトを2秒にする場合は、次のように設定します。
LOCK_TIMEOUT=2
CMD_LOCK_TIMEOUT=FOR UPDATE WAIT 2
DBMS_RETCODE_ROW_LOCKED=30006
ロックのタイムアウトを全く待たないようにする場合は、次のように設定します。
LOCK_TYPE=S
LOCK_TIMEOUT=2
CMD_LOCK_TIMEOUT=FOR UPDATE NOWAIT
DBMS_RETCODE_ROW_LOCKED=54
WindowsおよびLinuxサーバーでは、クライアントとサーバーは、サーバーで使用されているデータベースタイプの x_dbmenv.dat 内で同じタイムアウト設定になっていなければなりません。 (LOCK_TYPE、LOCK_TIMEOUT、CMD_LOCK_TIMEOUT、DBMS_RETCODE_ROW_LOCKED) 設定が異なる場合、 *DBMS_RECORD_LOCKED から Y が返ってくるはずの時に N が返されることがあります。