2010-06-19 27 views

回答

7

您必須等待。遇害的會議正處於交易中,並更新了很多記錄。這些記錄必須被回滾,並且一些後臺進程正在處理這個問題。在此期間,您無法修改所觸及的記錄。

+0

當@ chyee的第1步沒有返回任何行時,這對我有效。 – stephen 2015-03-12 15:19:29

4

當您終止會話時,會話在「KILLED」狀態下掛起一段時間,而Oracle在其後清理。

如果你絕對必須的話,你也可以殺死操作系統進程(查找v$process.spid),這會釋放所有鎖。

有關詳細信息,請參閱this

56

第1步:

select object_name, s.sid, s.serial#, p.spid 
from v$locked_object l, dba_objects o, v$session s, v$process p 
where l.object_id = o.object_id and l.session_id = s.sid and s.paddr = p.addr; 

第2步:

alter system kill session `'sid,serial#';--sid` and `serial#` get from step 1 

更多信息:http://www.oracle-base.com/articles/misc/killing-oracle-sessions.php

+0

我得到ORA-00054錯誤,但select沒有行。 – Kiquenet 2014-10-29 12:44:54

+16

第1步給我ORA-00942:表或視圖不存在 – Yokhen 2014-11-22 02:48:39

+1

你救了我的夜晚:) – 2015-05-07 21:10:07

7

感謝信息用戶user712934「

你也可以看一下sql,用戶名,機器,端口信息並進入保存連接的實際進程

SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM,S.USERNAME, 
S.MACHINE,S.PORT , S.LOGON_TIME,SQ.SQL_FULLTEXT 
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S, 
V$PROCESS P, V$SQL SQ 
WHERE L.OBJECT_ID = O.OBJECT_ID 
AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR 
AND S.SQL_ADDRESS = SQ.ADDRESS; 
+0

在本頁面的所有回覆中,這對我的幫助最大。當我遇到原始問題提到的錯誤時,我運行此查詢。該查詢告訴我當前鎖定了哪些表。驚訝它沒有更多upvotes .... – 2015-04-21 12:48:54

3

根據您的情況,被鎖定的表可能只是一個正常運行&的一部分,你不想殺了阻塞事務。 你想要做的是讓你的語句等待其他資源。 Oracle 11g has DDL timeouts which can be set來處理這個問題。

如果你正在處理10g,那麼你必須獲得更多的創造力,並編寫一些PL/SQL來處理重試。看看Getting around ORA-00054 in Oracle 10g當發生resource_busy異常時,這會重新運行您的語句。

相關問題