首頁 >資料庫 >Oracle >oracle中insert會鎖表嗎

oracle中insert會鎖表嗎

WBOY
WBOY原創
2022-05-30 16:29:118375瀏覽

oracle中insert會鎖定表;當oracle執行insert等DML語句時,會在所操作的表上申請一個鎖,兩個insert語句同時試圖向一個表進行操作時,就會造成會話被堵塞,等待其他會話提交或回滾,因而造成死鎖。

oracle中insert會鎖表嗎

本教學操作環境:Windows10系統、Oracle 11g版、Dell G3電腦。

oracle中insert會鎖定表嗎

oracle中insert會鎖定表

當ORACLE執行insert等DML語句時,會先自動在要操作的表上申請一個TM鎖,當TM鎖獲得後,再自動申請TX類型的鎖。當兩個或多個會話在表的同一記錄上執行DML語言時,第一個會話在記錄上加鎖,其它的會話處於等待狀態,一直到第一個會話提交後TX鎖釋放,其它的會話才可以加鎖。

考慮是因為兩個insert語句同時試圖在一個表中插入PK或unique值相同的數據,而造成其中會話被阻塞,等待其它會話提交或回滾,因而造成死鎖。

這種情況,只要其中任何一個session提交,另外一個就會報出ORA-00001:違反唯一性約束條件,死鎖終止;或者其中一個session回滾,另外一個即可正常執行。

在oracle中,鎖定表的原因是當一個程式執行了對一個表的insert,並且還未commite時,另一個程式也對同一個表進行insert,則此時就會發生資源正忙的異常,也就是鎖表。

主要的鎖定表原因有:

(1) A程式執行了對tableA 的insert ,並還未commite時,B程式也對tableA 進行insert則此時會發生資源正忙的異常就是鎖表

(2)鎖定表常發生於並發而不是並行(並行時,當一個執行緒操作資料庫時,另一個執行緒是不能操作資料庫的, cpu 和i/o 分配原則)

減少鎖定表的機率方法:

(1)減少insert 、update 、delete 語句執行到commite 之間的時間。具體點批量執行改為單一執行、優化sql自身的非執行速度

(2)如果異常對事物進行回滾

鎖表原因可能是修改了行數據,忘了提交,也會造成鎖表。

擴充知識:

鎖定表建議先查原因再做決定。

1鎖定表查詢的程式碼有以下的形式:

select count(*) from v$locked_object;
select * from v$locked_object;

2.查看哪個表被鎖定

select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;

3查看是哪個session引起的

select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;

推薦教學:《Oracle影片教學

#

以上是oracle中insert會鎖表嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn