2012-04-27 129 views
0

從甲骨文的文檔: -ORA-00054錯誤的原因是什麼?

ORA-00054 resource busy and acquire with NOWAIT specified 

    Cause: Resource interested is busy. 
    Action: Retry if necessary. 

在我們的代碼,我們發出SELECT FOR UPDATE NOWAIT命令來鎖定該行我們即將更新。

現在的邏輯是,如果它返回SQL錯誤54,則假定另一個用戶正在嘗試更新同一記錄。這個邏輯是否有效?

從Oracle的文檔看來,它更像是數據庫不堪重負,這也可能導致此錯誤被拋出。

當我們只使用上面的SQL命令時,這個錯誤的可能原因是什麼?

+1

錯誤是立即返回還是作爲超時? – skaffman 2012-04-27 12:45:18

+0

我無法調試或放置sops,因此我不確定它是否立即返回。代碼在獨立服務器中運行。 – AppleGrew 2012-04-27 12:48:24

回答

2

SELECT ... FOR UPDATE嘗試獲取表上的RS(行共享)鎖和該行上的X(獨佔)鎖。如果另一個會話在表上有獨佔鎖(例如創建索引)或對行進行排它鎖(更新,刪除或選擇更新),則查詢將等待另一個事務釋放鎖(提交或回滾一般情況下)除非你指定NOWAIT。

所以一種可能性是不指定NOWAIT。

我不承認數據庫可能因爲「不堪重負」而拋出此錯誤的情況。

+0

這是這裏的問題。這是我的本地數據庫,我是唯一的用戶。有沒有什麼辦法找到它形式的數據庫哪個用戶已鎖定該行導致此錯誤? – AppleGrew 2012-04-27 13:12:21

+0

糟糕我最後的評論不清楚。有沒有辦法從數據庫中查找哪個用戶以及哪個查詢鎖定了導致此錯誤的行? – AppleGrew 2012-04-27 13:19:38

+0

如果將查詢修改爲WAIT,則系統視圖DBA_WAITERS應幫助您識別鎖定會話。 – 2012-04-27 13:23:35

相關問題