"ORA-00054 resource busy and acquire with NOWAIT specified"的解決方法

ysping發表於2009-08-08

今天在做同步時,出現如下錯誤:

ORA-00054 resource busy and acquire with NOWAIT specified
”資源正忙,需指定nowait"

[@more@]

出現這個問題的原因是正在執行的操作請求的資源正被其他事務鎖定。

nowait:立即執行,如果另有會話正在修改該記錄會立即報告錯誤:ORA-00054: 資源正忙,要求指定 NOWAIT;如果不選擇nowait選項則會一直處理等待狀態。
wait [n]:等待n秒,如果另有會話正在修改該記錄會報告錯誤:ORA-30006: 資源已被佔用; 執行操作時出現 WAIT 超時
=>另外,還有一個skip locked。
skip locked:跳過已被別的會話鎖定的記錄。

例如:

SELECT ... FOR UPDATE [OF ...][NOWAIT | WAIT integer]

NOWAIT指在執行"SELECT ... FOR UPDATE"時其他事務修改了該查尋的結果但還沒有提交,此時將立即返回如下結果:
ORA-00054: resource busy and acquire with NOWAIT specified
如果不使用NOWAIT等項,預設為等待(WAIT)其他事務提交後在返回結果。


WAIT integer,與NOWAIT的功能相似,但可以等待使用者指定的秒數。如:"WAIT 3"等待3秒後,其他事務還沒有提交將返回如下結果:
ORA-30006: resource busy; acquire with WAIT timeout expired 。

出現這種問題後查V$LOCKED_OBJECT,要麼等事務結束後再做,要麼殺掉持有鎖的會話(如果不是關鍵會話):

1.透過上句查詢出已被鎖定的資料庫表及相關的sid、serial#及spid
select object_name as 物件名稱,s.sid,s.serial#,p.spid as 系統程式號
from v$locked_object l , dba_objects o , v$session s , v$process p
where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr;

2.在資料庫中滅掉相關session
alter system kill session 'sid,serial#';--sid及serial#為第一步查出來的資料。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/670493/viewspace-1025077/,如需轉載,請註明出處,否則將追究法律責任。

相關文章