oracle數據表被鎖

1、數據庫表被鎖的現象

在操作數據庫時,有的時候我們會很突然的遇到數據庫報下面這個錯誤


ORA-00054: resource busy and acquire with NOWAIT specified


下面是從網上獲取的對該問題的解析,供大家參考


第一個可能的原因是在lock table 和select for update 的句子中有nowait關鍵字導致報錯。nowait關鍵字的意思是當你要鎖定某一資源時,如果該資源正被別的用戶鎖定則直接返回錯誤信息,而不是等待別的用戶解鎖。

第二個原因是你執行了ddl語句並且這個ddl 無法獲得需要的鎖。



2、表被鎖的解決辦法

第一種辦法是“治病”,採用如下方法可以解決眼前遇到的問題,既然表被鎖,那麼解鎖就是了。

SELECT a.username,decode(b.type,'TM','TABLE LOCK','TX','ROW LOCK',NULL) LOCK_LEVEL,
c.owner,c.object_name,c.object_type,
a.sid,a.serial#,a.terminal,a.machine,a.program,a.osuser
FROM v$session a,v$lock b,dba_objects c
WHERE b.sid = a.sid
AND b.id1 = c.object_id(+)
AND a.username is NOT Null;


找到被鎖的表,執行以下語句解鎖


alter system kill session 'sid,serial#';
以上方法是看病就醫的辦法,難保以後還回遇到這個問題,下面看看另一個辦法。


第二種辦法是“治本”,這個辦法是oracle_11g才適用的方法,
[sql] view plain
copy

alter session set ddl_lock_timeout = 600;
或者


[sql] view plain
copy

alter system set ddl_lock_timeout = 600;
這種方法是設置系統或會話的鎖定時間。這個辦法實際上也不是治本的方法,但是可以減少人工操作罷了,要想治本還是要求我們的開發人員和數據庫使用人員在操作數據庫的時候記得要commit。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章