关于没有commit的死锁问题
生活随笔
收集整理的這篇文章主要介紹了
关于没有commit的死锁问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據剛遷移到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
總結
以上是生活随笔為你收集整理的关于没有commit的死锁问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库升级后,准备使用原有数据文件启动数
- 下一篇: ORACLE11G RAC增加节点操作