Oracle行ロック、タイムアウト

はじめに

Oracleで行または表に対して他のプロセスからの参照/更新をブロックするには、select文の最後にfor updateを指定します。

以下の例ではtable01テーブルに対してテーブルロックがかかります。

select * from table01 for update;

ロックがかかっている行および表を参照する際、ロックタイムアウト時間を明示的に指定しない場合、ロックを取得したトランザクションが終了するまで永遠に待ち続けます。

ロックタイムアウト時間を明示的に指定する

別プロセスがロックを取得していた場合に、エラーを返せるようロックタイムアウト時間を設定するには、wait ロック待ち時間(sec)を指定します。

以下の例では、table01テーブルに対してテーブルロックがかかります。他のトランザクションがすでにロックを取得していた場合は、10秒だけ待ってタイムアウトします。

select * from table01 for update wait 10;
ロックタイムアウトに達した場合のエラー

ロックタイムアウトが発生した場合は、以下のエラーとなります。

ORA-30006: リソース・ビジー; WAITタイムアウトの期限に達しました。

sqlplus remote oracle database

C:\>sqlplus dacs2011/dacs2011@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=oracle_database_fqdn)(Port=1521))(CONNECT_DATA=(SID=database_schema_id)))

SQL*Plus: Release 11.2.0.2.0 Production on 金 6月 26 10:19:01 2015
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
Oracle Database 11g Release 11.2.0.4.0 – 64bit Production
に接続されました。

Alter table:
SQL> ALTER TABLE Table_Name

Alter view:
SQL> CREATE OR REPLACE FORCE VIEW

SQLDeveloper&SQL Command

SQL*Plus: Release 11.2.0.2.0 Production on 月 10月 28 20:21:17 2013
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
ERROR:
ORA-12170: TNS: 接続タイムアウトが発生しました。
ユーザー名を入力してください: system
パスワードを入力してください:
Oracle Database 11g Express Edition Release 11.2.0.2.0 – Production
に接続されました。
SQL>
SQLDeveloperが接続できない、コマンドで接続できるようになったのは、監視ポートの設定をしなかったです。