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