ORACLE死锁故障排查的一般性手法的备忘录
故障现象:
两个Java写的后台批处理同时执行时,发生了死锁现象。
排查手法:
通过查询视图,找到被锁住的对象v$locked_object,根据其locked_mode,判断其锁类型查询SQL语句:
select l.xidusn, l.object_id, o.owner, o.object_name,
l.session_id, l.oracle_username, l.os_user_name, l.process,
decode(l.locked_mode, 0, '',
1, 'NULL',
2, '(SS)',
3, '(SX)',
4, '(S)',
5, '(SSX)',
6, '(X)',
'???') locked_mode
from v$locked_object l, dba_objects o
where l.object_id= o.object_id
判断查询结果,发现两个Session对同一个表的数据行进行了排他。
用以下的语句对视图v$sqltext进行查询,可以得到当前正在执行的SQL语句,以及执行SQL 语句的session
select username, osuser, machine, terminal, program,
sid, serial#, status, sql_address, sql_text
from v$session ss, v$sqltext sq
where type ='USER'
and ss.sql_address = sq.address
order by ss.sid, ss.serial#, sq.piece