oracle enqueuse類型鎖 (一)

一、鎖分爲
Enqueuse --- 隊列類型的鎖,通常和業務相關,
Latches --- 系統資源方面的鎖,比如內存結構,sql解析等。。。
二、鎖的原則
只有被修改時,行纔會鎖定。
當一條語句修改了一條記錄,只有這條記錄上被鎖定,在oracle中不存在鎖上升,不會由原來的表鎖上升到表鎖。
當某行被修改時,他將阻塞別人修改他。
當一個事物修改一行時,他將在這一行上加上一個行鎖(tx),用於阻止其他事物對相同行的修改。
讀永遠不會阻止寫,除非select ...for update,同樣寫也不會阻止讀,當一行被修改後,但是沒有提交,由會滾段提供數據的一致性讀。


當要修改某張表的一行數據,oracle會在這張表上加兩個鎖,一個TM表鎖,一個TX行鎖,添加表TM鎖的原因是不能讓其他的事物去刪除這張表。

 

註釋:查詢當前session的sid ;
select distinct sid from v$mystat;

 

update例子:

1.t表裏只有一條數據,並且id字段是主鍵

2.對id=1進行修改,不提交

3.新開一個窗口,再次對這個id=1 進行修改

 

4.查詢鎖視圖v$lock

select sid,type,id1,id2,lmode,request , ctime,block from v$lock where type in ('TM','TX') order by 1,2;

type:鎖的類型

sid:回話的sid

lomde:3號模式鎖是共享鎖,誰都能給他加這個鎖,6是排它鎖只有我可以用,模式有2、3、4、5、6這幾種。

request:去請求什麼鎖,這裏可以看出sid爲38的在請求一個排他的事物鎖(行鎖TX)

block:有沒有阻塞別人,這裏可以看出sid爲1的已經阻塞了別人。

 

現在我們去看下等待事件v$session_wait;

這裏可以看出sid爲38的產生了等待,enq就是上面我們說的Enqueuse類型,原因是事物鎖(tx鎖等待)

delete鎖的情況和update一樣。

insert 例子:

insert相對於update和delete是有區別的,update和delete操作的是同樣的一條數據(比如id=1 就是這條數據)

1.現在表裏只有一條數據

2.增加一條

3.另一個窗口,在增加一條,產生了等待。

4.查看v$lock

這裏就和update不一樣了,sid爲1的阻塞了sid爲38的會話,但是sid爲38的比之前多了一行,他已經獲取到了模式爲6的事物鎖(TX),update和delete操作的是同樣的一條數據(比如id=1 就是這條數據),insert 是往裏面插數據,不是update那種的同一條數據。他去請求模式爲4的事物鎖。

在數據庫中模式越大,鎖的等級越高,6是限制性最強的。

鎖的互斥關係

上圖中 鎖定的sql一列可以手工加上去的,t是表名。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章