我这几天正好在忙着解决类似的问题。你可以在发现有可能出现死锁的情况执行下面操作:
select sid,ID1,ID2,TYPE from v$lock;如果纪录多,可以增加一个id1>1000,因为大部分用户建立的对象编号大于1000。根据得出id1结果,查询dba_objects表 object_id=id1。这样你就可以知道当前那些对象被锁住。
通过selectSQL_TEXT from v$session se,v$sqlarea sq where se.SQL_HASH_VALUE=sq.HASH_VALUE and se.SERIAL#=你希望查询的用户编号; 可以看到当前制定用户运行的语句,了解哪些语句产生了锁。
给你一个metalink上的脚本专门用于分析锁信息。
当然你也可以使用statspack产生分析报表,如果在top5事件中发现enqueue事件就说明你的系统锁等待严重。