待機時間

提供: InterBase

SET TRANSACTION へ戻る


はじめに


ロック可能なリソースを取得する際に、InterBase トランザクション ロックは、無期限での待機も、指定された期間の待機も、もしくはまったく待機せずに即座にエラーを返すことも可能です。トランザクションが、要求されたロック レベルに合わないレベルで、リソースのロックを保持した場合、他のトランザクションはこのリソースにアクセスできなくなります。ロック可能なリソースは、テーブル、行、またはトランザクションのエンティティです。


用途

これは、ロック解決モードを指定する SQL 構文です:

SET TRANSACTION {[NO] WAIT};

WAIT は、リソース ロックが取得されるまで、無期限で待機することを意味します。

待機時間を指定するには、オプションの WAIT 句で秒数を指定します。これが、トランザクションが 1 リソースに対するロックを待つ時間となります:

SET TRANSACTION WAIT [<number> [SECONDS]];

リソースのロックが、待機時間中に取得されなければ、isc_lock_timeout エラー コードが返されます。

たとえば、テーブルの切り捨てを行おうとしているとしましょう。テーブルの切り捨てでは、対象テーブルと、その対象テーブル上に外部キー制約を持つ参照テーブルに対して、排他ロックを取得しようとします。そのテーブルに対する他のトランザクションの利用が活発な場合には、トランザクションの待機時間を指定することが望ましいです。

SQL> set transaction wait 10 seconds;
SQL> truncate table salary_history;
Statement failed, SQLCODE = -901
 
lock time-out on wait transaction
-unsuccessful metadata update
-object SALARY_HISTORY is in use
SQL>

isc_tpb_wait_time という新しいトランザクション パラメータ ブロック(TPB)パラメータがあり、次の InterBase トランザクション API で使用されます:isc_start_transaction()isc_reconnect_transaction()isc_start_multiple()。続くリテラル文字 "4" はバイト数を表し、リトル エンディアン形式での 4 バイトは、秒数での待機時間を示します。ここに、それぞれ 30秒と 300秒(5分)の待機時間を示す例を示します。

isc_tpb_wait_time, 4, 30, 0, 0, 0
isc_tpb_wait_time, 4, 44, 1, 0, 0

クラス interbase.interclient.Connection: setLockResolution( int mode, int waitTime ) には、InterClient/JDBC 拡張 API メソッドがあります。既存のメソッド setLockResolution( int mode )setLockResolution( int mode, 0 ) と同等です。


/* Set transaction timeout to 1 minute */
 
Driver driver = interbase.interclient.Driver();
Connection connection = driver.connect(url, properties);
(interbase.interclient.Connection connection).setLockResolution(LOCK_RESOLUTION_WAIT, 60);
 

FireDAC、IBX、ODBC フレームワークが、この機能に対する低層レベルでの統合サポートを提供するようになることが期待されます。

要件と制約

  • WAIT の時間は、1 から 32,767 まで(そして32,767も含む)正の整数です。これは 9 時間に相当します。
  • リモートおよびローカルの基礎プロトコルは、32 ビット整数を渡すため、プロトコルを変更しなくてもこの制限は増加させることができます。
  • この機能は、Dynamic SQL で利用できますが、Static (組み込み) SQL ではできません。
  • この機能は、InterClient/JDBC API で利用できます。
  • この機能は、FireDAC、IBX、ODBC フレームワークによるトランザクション プロパティとしては見えませんが、パススルー DSQL としては利用可能なはずです。

移行に関わる問題

  • オプションの WAIT 句は、InterBase の 2020 Update 4 より古いバージョンでは、SQL パーサーが認識しません。
  • isc_tpb_wait_time TPB パラメータは、InterBase の 2020 Update 4 より古いバージョンでは、API レベルで認識されません。

次は: