数据刚迁移到ORACLE,测试时看到一存储过程,一到UPDATE 语句时,就定在那里了,无法再走一去。
开始是以为其它的什么原因,准备进行
跟踪 存储过程,看update table_name语句的瓶颈。
--修改跟踪文件
SQL> alter session set tracefile_identifier=TANG;
Session altered
SQL> alter session set sql_trace=true;
Session altered
看到在COMMAND 窗口下,测试存储过程总出错,
那就回到sql 窗口下去。
create or replace trigger trace_login_trigger_tang
after logon on database
begin
if user = 'TANG' then
execute immediate 'alter session set tracefile_identifier = TANG';
dbms_session.session_trace_enable(waits => TRUE, binds => FALSE,
plan_stat => 'all_executions');
end if;
end;
查看当前会话,
enq:TX-row lock contenction 等待达到 了100%
查询锁情况:
select s.sid, s.serial#, s.username,
machine, a.object_name, decode(locked_mode, 0,
'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_type,
paddr,p.addr,p.spid
from v$session s, v$locked_object l, all_objects a, v$process p
where s.sid = l.session_id
and p.addr = paddr
and l.object_id = a.object_id;
查询锁情况:
SID SERIAL# USERNAME MACHINE OBJECT_NAME LOCK_TYPE PADDR ADDR SPID
1 17 14129 TANG WORKGROUP\UYLF3RKKWO8D59O MT_CARD_AUDIT Row Exclusive 000000022251D050 000000022251D050 15671
2 17 14129 TANG WORKGROUP\UYLF3RKKWO8D59O MT_CARD_AUDIT Row Exclusive 000000022251D050 000000022251D050 15671
跟踪等待事件:
SID SERIAL# USERNAME MACHINE PROGRAM EVENT
1 17 14129 TANG WORKGROUP\UYLF3RKKWO8D59O plsqldev.exe SQL*Net message from client
看到一直在等待状态;
杀掉Oracle进程中的锁实操
alter system kill session '42,21993';
(其中24,111分别是上面查询出的sid,serial#)
问题解决。
再次查看存储过程,确实是每次UPDATE后,没有COMMIT;
这就是ORACLE与SQL SERVER 的区别所在,很久没写ORACLE代码,教训呀!!!!
以下帖子,启发很大
http://www.itpub.net/thread-1753611-1-1.html