2010-03-11 32 views
2

當我在oracle 9數據庫中運行下面的Sql命令時,我一直進入「enq:TX - 行鎖爭用」。 表mytable是一個小表,少於300行。Oracle行鎖的長隊列時間

UPDATE MYTABLE 
SET  col1 = col1 + :B3 , 
     col2 = SYSDATE 
WHERE :B2   = col3 
    AND :B1  = col4 

我在同一時間運行10個線程,有些人等待只要10秒鐘,以獲得更新的機會。我知道我會面對這個僵局問題,但對我來說,問題是他們應該能夠快得多,因爲表格很小,所以更新它會很快。

編輯:我不能改變這段代碼,它在第三方應用程序中。我只能調整數據庫。

我該怎麼做才能提高行鎖隊列的速度? 我該如何改善這個等待時間,讓我的線程跑得更快?

+0

更新通常會影響多少行? – 2010-03-11 14:53:02

+0

每個更新隻影響一行。但很多時候,我有十個線程試圖更新同一行。 – kurast 2010-03-11 15:03:17

回答

2

如果你不想被阻止,不要試圖盲目更新。首先執行SELECT FOR UPDATE NOWAIT。如果引發異常(ORA-00054),這意味着另一個會話當前正在處理該行。在這種情況下,根據您的要求,您可以嘗試更新另一行(您是否嘗試構建隊列/出列進程?),等待(dbms_lock.sleep)或將錯誤消息返回給調用應用程序。

您將會從不如果您先用FOR UPDATE NOWAIT鎖定行,將會面臨死鎖。

+0

忘了說,但我不能改變代碼。現在我編輯了我的問題 – kurast 2010-03-11 15:01:12

+1

@kurast:更新本身可能不需要很長時間。時間花在等待其他會話**提交/回滾。如果這些線程是後臺批處理作業,則可能爭用預期/無害。如果他們是活躍的前臺會話,他們爲什麼試圖更新同一行? – 2010-03-11 15:20:10