ORA-00060とは
ORA-00060はデッドロックを検出した場合に発生するエラーです。デッドロックとはロックが循環した状態(AはBを待ちBはAを待っているような状態)であり、
この状態になると処理が永遠に終わらないためORACLEはデッドロックの発生を検知するとデッドロックの原因となっている処理の一つをORA-00060のエラーで異常終了させ、エラーにした処理を実行する前の状態までロールバックします。
なお、トランザクション自体がロールバックされるわけではないので注意が必要です。
対策
ORA-00060の原因となったSQLがユーザアプリケーションが実行したSQLの場合はユーザアプリケーションの問題であるため基本的にはユーザアプリケーション側で対応が必要です。
対策としてはロックのタイミングをずらす、一連の処理でロックする可能性のある行やオブジェクトがロックできることを確認した上で処理するようにする、といった方法が考えられます。
再帰SQL等、内部的に実行されるSQLでORA-00060を受けていた場合はサポート等に相談をしたほうがよいでしょう。
確認
ORA-00060が発生した場合アラートログに以下のような記録がされるとともに、シングル環境においてはORA-00060が発生したプロセスのトレースファイルにデッドロックの解析情報が出力されます。
このトレースから原因となったSQLやロックの種類、セッション情報等を確認することができます。
Sat Apr 30 22:36:03 2011
ORA-00060: Deadlock detected. More info in file j:\program\oracle\diag\rdbms\orcl112\orcl112\trace\orcl112_ora_3916.trc.
RAC環境の場合は以下のような出力となりORA-00060というエラーコードは出力されず、トレースの内容も全く異なるため注意が必要です。
Sat Apr 30 23:49:55 2011
Global Enqueue Services Deadlock detected. More info in file
/app/diag/rdbms/rac112/rac1121/trace/rac1121_lmd0_4240.trc.