schedule2020-02-26

OracleDBで ORA-00054:resource busy and acquire with NOWAIT specified or timeout expiredが出た

OracleDBで ORA-00054:resource busy and acquire with NOWAIT specified or timeout expiredが出て解決したのでメモ

バックエンドでこのエラーが出た。

; SQL []; ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
; nested exception is java.sql.SQLException: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

IBM Knowledge Centerによると、どうやら該当レコードにの排他ロックがかかっているためこのエラーが出たようです。

問題の解決から、排他ロックを妨げているセッションを見つけて停止をしてみます。

ロックしているセッションの停止

こちらの通りのことを試してみます。

まず、ロックしているセッションのSIDと**SERIAL#**を探します。

SELECT SID, SERIAL#
FROM V$SESSION
WHERE
 SID IN(
  SELECT SID
  FROM V$LOCK
  WHERE TYPE IN('TM', 'TX')
 )

SID=68, SERIAL#=36478でした。ここまで分かるとセッションをKILLできます。

ALTER SYSTEM KILL SESSION '<SID>, <SERIAL#>';

ALTER SYSTEM KILL SESSION '68, 36478';

根本的な原因

その後も何度かORA-00054が出てしまいました。 DBの操作に利用していたOracle SQL Developerが原因だったようです。

SQL Developerでupdateのクエリを走らせるとロックします。 終了するとロックもなくなる。 バージョンは 19.1.0.094です。

慣れたDBじゃないのでエラーは怖い。

参考