過去一段時間我注意到,在嘗試發出SELECT ... FOR UPDATE NOWAIT
時,我們得到了ORA-00054
錯誤,期間大量的db併發更新。這是我們的開發系統,我們確實沒有任何其他用戶,或者至少這是我們所相信的。如何找到導致ORA-00054的原因?
我們已經通過我們的應用程序的日誌,它似乎一切正常;沒有線程正在嘗試更新同一行。
如何配置Oracle數據庫生成日誌上這將讓我知道它持有鎖出現此錯誤時的用戶ID?
過去一段時間我注意到,在嘗試發出SELECT ... FOR UPDATE NOWAIT
時,我們得到了ORA-00054
錯誤,期間大量的db併發更新。這是我們的開發系統,我們確實沒有任何其他用戶,或者至少這是我們所相信的。如何找到導致ORA-00054的原因?
我們已經通過我們的應用程序的日誌,它似乎一切正常;沒有線程正在嘗試更新同一行。
如何配置Oracle數據庫生成日誌上這將讓我知道它持有鎖出現此錯誤時的用戶ID?
從這裏: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;
謝謝。然而,就我而言,根源是ITL的爭奪。我們有更小的行,所以它們中的很多被打包到一個塊中。當所有行同時被鎖定時,標題沒有爲ITL條目保留足夠的空間。 – AppleGrew
請使用
select * from v$locked_object
用於獲取鎖定信息
既然是開發環境,你可以嘗試以下鏈接
https://forums.oracle.com/forums/thread.jspa?threadID=324530
更全面的方法所提供方法使用v $ lock在以下鏈接提供
刪除NOWAIT,並監視DBA_BLOCKERS/DBA_WAITERS。
不幸的是,這不是我的選擇,因爲代碼在我們使用的框架內部很深。我們也沒有源代碼。 – AppleGrew
您可以修改與DBMS_ADVANCED_REWRITE SQL語句:http://dioncho.wordpress.com/2009/03/06/optimizing-unoptimizeable-sql-dbms_advanced_rewrite/ –
@jonearles這將是有趣的,知道這是可能的SELECT ... FOR UPDATE NOWAIT - 我敢肯定,你不能覆蓋NOWAIT,因爲它不是dbms_advanced_rewrite中指定的子選擇語句的一部分。 –
也許這可能有一定的幫助的實際處理的HTTP ://asktom.oracle.com/pls/asktom/f?p = 100:11:0 :::: P11_QUESTION_ID:4515126525609 –
當你說「大量的併發更新」時,請你詳細解釋一下你的應用程序是在做? – APC
相關的問題[dba.se] [追蹤,調試和修復Row Lock爭用](http://dba.stackexchange.com/q/1726/120) – Sathya