2012-04-30 60 views
3

過去一段時間我注意到,在嘗試發出SELECT ... FOR UPDATE NOWAIT時,我們得到了ORA-00054錯誤,期間大量的db併發更新。這是我們的開發系統,我們確實沒有任何其他用戶,或者至少這是我們所相信的。如何找到導致ORA-00054的原因?

我們已經通過我們的應用程序的日誌,它似乎一切正常;沒有線程正在嘗試更新同一行。

如何配置Oracle數據庫生成日誌上這將讓我知道它持有鎖出現此錯誤時的用戶ID?

+0

也許這可能有一定的幫助的實際處理的HTTP ://asktom.oracle.com/pls/asktom/f?p = 100:11:0 :::: P11_QUESTION_ID:4515126525609 –

+0

當你說「大量的併發更新」時,請你詳細解釋一下你的應用程序是在做? – APC

+1

相關的問題[dba.se] [追蹤,調試和修復Row Lock爭用](http://dba.stackexchange.com/q/1726/120) – Sathya

回答

6

從這裏:ORA-00054: resource busy and acquire with NOWAIT specified

你也可以看一下SQL,用戶名,計算機,端口信息,並獲得其持有的連接

SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM,S.USERNAME, 
S.MACHINE,S.PORT , S.LOGON_TIME,SQ.SQL_FULLTEXT 
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S, 
V$PROCESS P, V$SQL SQ 
WHERE L.OBJECT_ID = O.OBJECT_ID 
AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR 
AND S.SQL_ADDRESS = SQ.ADDRESS; 
+0

謝謝。然而,就我而言,根源是ITL的爭奪。我們有更小的行,所以它們中的很多被打包到一個塊中。當所有行同時被鎖定時,標題沒有爲ITL條目保留足夠的空間。 – AppleGrew

3

刪除NOWAIT,並監視DBA_BLOCKERS/DBA_WAITERS。

+0

不幸的是,這不是我的選擇,因爲代碼在我們使用的框架內部很深。我們也沒有源代碼。 – AppleGrew

+0

您可以修改與DBMS_ADVANCED_REWRITE SQL語句:http://dioncho.wordpress.com/2009/03/06/optimizing-unoptimizeable-sql-dbms_advanced_rewrite/ –

+0

@jonearles這將是有趣的,知道這是可能的SELECT ... FOR UPDATE NOWAIT - 我敢肯定,你不能覆蓋NOWAIT,因爲它不是dbms_advanced_rewrite中指定的子選擇語句的一部分。 –

相關問題