2009-08-05 16 views
2

我可以更新一些表就好了,但某個表我不能用我的任何ASP.NET應用程序或SQLPLUS進行更新。兩者都無限期地掛起。我必須強行退出SQLPLUS。我有兩個標準的OracleCommand對象運行的更新statments:甲骨文更新某些表都會掛起

cmd.ExecuteNonQuery(); 

,但我也有ASP:綁定到一個GridView SqlDataSources。似乎沒有任何工作。

有一個類似的問題在這裏:Oracle Update Hangs。我有一個大概的想法,那就是某些東西必須在這張桌子上有一個鎖,但是我不知道如何去除它,甚至不知道它是如何發生的。任何幫助將不勝感激。

我運行Oracle 9i的EE 9.2。

回答

6

機會是另一個會話有未提交的工作(即更新或刪除)

你可以找到它的會話(S),這可能是與...

select s1.username || '@' || s1.machine || ' (SID=' || s1.sid || ') is blocking ' 
    || s2.username || '@' || s2.machine || ' (SID=' || s2.sid || ') ' AS blocking_status 
    from v$lock l1, v$session s1, v$lock l2, v$session s2 
    where s1.sid=l1.sid and s2.sid=l2.sid 
    and l1.BLOCK=1 and l2.request > 0 
    and l1.id1 = l2.id1 
    and l2.id2 = l2.id2 

編輯:

機會是你的代碼在某處丟失了一點點的COMMIT。

入住V $ SESSION違規的會話ID,看看你能找出它可能是哪些代碼。

爲了幫助您找到胭脂代碼(假設它是什麼),你可以找到的最後一個SQL命令運行由會話使用...

select * 
from v_$sqltext, v_$session 
where v_$session.prev_hash_value = v_$sqltext.hash_value 
and [some filter on v_$session] 
+0

非常酷,謝謝。現在,它返回6行,SID 28阻止6個不同的SID。我如何讓這些暢通無阻? =) – Chet 2009-08-05 14:17:21

+0

如果你不能提交/回滾這些會話,那麼你可以使用ALTER SYSTEM KILL SESSION'session-id,session-serial'來殺死它們。 要小心,你知道你殺什麼,避免做,如果你可以簡單地結束,它的運行造成塊交易 – 2009-08-05 14:23:02