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じゃないのでエラーは怖い。