oracle中記錄被另乙個使用者鎖住的原因與解決

2021-07-10 16:17:26 字數 1497 閱讀 8253

原因:

資料庫是乙個多使用者使用的共享資源。當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。
原理:

1.update/delete操作會將rs鎖定,直至操作被commit或者rollback;

若操作未commit之前其他session對同樣的rs做變更操作,則操作會被hold,直至前session的update/delete操作被commit;

2.session內外select的rs範圍

前提:insert、update操作未commit之前進行select;

若在同一session內,select出來的rs會包括之前insert、update影響的記錄;

若不在同一session內,select出來的rs不會包括未被commit的記錄;

3.select.... for update [of cols] [nowait/wait] [skip locked]

of cols:只鎖定指定字段所在表的rs,而沒有指定的表則不會鎖定,只會在多表聯合查詢時出現;

nowait:語句不會hold,而是直接返回錯誤ora-00054: resource busy and acquire with nowait specified;

wait n:語句被hold n秒,之後返回錯誤ora-30006: resource busy; acquire with wait timeout expired;

skip locked:不提示錯誤,而是直接返回no rows selected;

select.... for update nowait:對同一rs執行該sql時,直接返回錯誤;

select.... for update nowait skip locked:對同一rs執行該sql時,直接返回空行;

ps:當rs被lock住之後,只對同樣請求lock的語句有效,對無需lock的select語句並沒有任何影響;

解決辦法:

oracle資料中刪除資料時提示「記錄被另乙個使用者鎖住」 解決方法:

1、檢視資料庫鎖,診斷鎖的**及型別:   select object_id,session_id,locked_mode from v$locked_object; 或者用以下命令: select b.owner,b.object_name,l.session_id,l.locked_mode from v$locked_object l, dba_objects b where b.object_id=l.object_id

2、找出資料庫的serial#,以備殺死:    select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time;

3、殺死該session   alter system kill session 'sid,serial#'

oracle 記錄被另乙個使用者鎖住

今天在oracle資料中刪除資料時提示 記錄被另乙個使用者鎖住 解決方法 1 檢視資料庫鎖,診斷鎖的 及型別 select object id,session id,locked mode from v locked object 或者用以下命令 select b.owner,b.object na...

oracle 記錄被另乙個使用者鎖住

今天在oracle資料中刪除資料時提示 記錄被另乙個使用者鎖住 解決方法 select object id,session id,locked mode from v locked object 或者用以下命令 select b.owner,b.object name,l.session id,l....

oracle 記錄被另乙個使用者鎖住

1 檢視資料庫鎖,診斷鎖的 及型別 select object id,session id,locked mode from v locked object 或者用以下命令 select b.owner,b.object name,l.session id,l.locked mode from v ...