5

過去しばらくの間、データベースへの多数の同時更新中に、ORA-00054を発行しようとしているときにエラーが発生することに気付きました。SELECT ... FOR UPDATE NOWAITこれは私たちの開発システムであり、実際には他のユーザーはいません。少なくともそれが私たちの信念です。

アプリケーションのログを確認しましたが、すべて問題ないようです。同じ行を更新しようとするスレッドはありません。

このエラーが発生したときにロックを保持しているユーザー ID を知らせるログを生成するように Oracle db を構成するにはどうすればよいですか?

4

3 に答える 3

9

ここから:ORA-00054:リソースがビジーで、NOWAITを指定して取得します

また、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;
于 2012-08-10T03:24:27.667 に答える
3

NOWAIT を削除し、DBA_BLOCKERS/DBA_WAITERS を監視します。

于 2012-04-30T08:12:54.937 に答える
1

ご利用ください

select * from v$locked_object 

ロック情報を取得するため

開発環境なので、以下のリンクで提供されているアプローチを試すことができます

https://forums.oracle.com/forums/thread.jspa?threadID=324530

以下のリンクで v$lock を使用して、より包括的なアプローチが提供されています。

http://www.orafaq.com/node/854

于 2012-04-30T05:45:46.090 に答える