Oracle效能優化二Lock

2021-09-08 17:51:48 字數 3434 閱讀 9214

沒有併發就沒有鎖,為了保證事務的正確邏輯

enqueues-佇列型別的鎖,通常和業務相關

latches-系統資源方面的鎖,比如內部結構,sql解析

latches門栓

通過下面這條查詢可以列出所有鎖

select type,name from v$lock_type
tm鎖,發生在insert,update,delete以及,select for update 操作時,目的保證操作能夠正常進行,並且組織其他人對錶執行ddl操作。

tx鎖,事務鎖(行鎖)對於正在修改的資料,阻塞其他會話進行修改。

update

delete

insert

兩個會話同時update 一條記錄時,會阻塞在同一行上,即這兩種語句都是會阻塞在同一條記錄上。

兩個會話同時delete 一條記錄時,會阻塞在同一行上,即這兩種語句都是會阻塞在同一條記錄上。

兩個會話同時insert 一條記錄時,會阻塞在表的資料塊頭上。

假設有一張表t,有乙個欄位id,id也是主鍵。

執行表記錄顯示為:

假設有兩個會話,session1和session2,同時更新id=2這條記錄。

session1做的更新如下圖,此時不提交,模擬這個事務很長:

session2做的更新如下圖,可以看到阻塞了:

下面執行一條比較重要的sql,涉及到乙個關鍵檢視v$lock

select sid,type,id1,id2,lmode,request,block from v$lock where type in ('tm','tx') order by 1,2;
上面sql做的事情是:從v$lock檢視中查詢type為tm和tx的資訊。

對於tm和tx鎖在上面對業務影響最大的兩種鎖tm鎖和tx鎖

已經說過,可以看看,更多的內容可以自行搜尋。

查詢v$lock檢視後的結果:

從圖中看有兩個會話,分別是sid為134和192。分別有乙個tm鎖和乙個tx鎖。

1、id1和id2

可以用乙個有dba許可權的使用者登入另乙個會話查詢這條sql

select object_name from dba_objects where object_id = 74324;
結果就是t表(如下圖),所以session1和session2都在使用這個t表的資源。

再看tx鎖的lmode字段值是6,6代表排它鎖,同一時刻只能有乙個執行緒或者會話能夠占有。

lmode為3表示共享鎖,可以看到兩個會話的tm鎖都是共享鎖,共享鎖顧名思義就是都可以對這個資源加鎖訪問。

3、request

request字段代表會話是不是在請求鎖,0代表不是。

使用有dba許可權登入的賬戶,可以使用下面這條sql查詢出當前會話的sid

select distinct sid from v$lock;
4、block

block欄位是1,說明是這個會話阻塞了其他會話。

前面關於v$lock檢視的學習,了解到從這個檢視可以獲得會話的鎖爭用情況,包括哪些會話阻塞在那張表上,誰阻塞了誰,誰在請求鎖這些資訊。下面看另乙個重要的檢視v$session_wait。

如果從會話層面優化,肯定要看這個表。

首先自己執行一下查詢:

select sid,event from v$session_wait where sid in (134,192);
結果:

這個檢視裡有個比較重要的字段是event,表示事件,從結果看,sid為192的會話,進入了乙個事務佇列,也就是在等待。

和上面的從v$lock裡分析的結果一致。

delete操作的鎖定和update的思路基本一致,不作重複分析

現在,先在session1中向t表插入一條記錄3,事務不提交(模擬乙個長的事務操作)。再次宣告一下我們的環境:表中只有乙個欄位id,且id是主鍵。

再在session2中執行另乙個插入,也是插入3。

現在,按照上面對update操作的鎖定的分析,查一下v$lock和v$session_wait檢視,結果依次見下面兩張截圖。

從結果中清楚的看到,從v$session_wait檢視插到的結果和update鎖定演示一致。不同的是v$lock檢視。

上面的insert操作,不是阻塞在同一條資料上,而是為了在一張表上不允許插入同一條資料,阻塞在表頭資料塊上。

和update的分析一樣,不作贅述。

row share(rs) --2

row exclusive table lock(rx) --3

share table lock (s) --4

share row exclusive table lock (srx) --5

exclusive table lock (x) --6

tm表鎖各種mode的實驗及2-6 的tm鎖相互間的互斥示例

對外鍵引用的表加鎖。主表insert操作,關聯表也會加鎖。從表insert、delete、update操作,主表也會加鎖。

參考:oracle的tm鎖、tx鎖知識完全普及

oracle的tm鎖、tx鎖

ORACLE效能優化 二

4.選擇最有效率的表名順序 只在基於規則的優化器中有效 oracle的解析器按照從右到左的順序處理from子句中的表名,因此from子句中寫在最後的表 基礎表 driving table 將被最先處理.在from子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表.當oracle處理多個表...

ORACLE高階之二 LOCK

資料庫是乙個多使用者使用的共享資源。當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。加鎖是實現資料庫併發控制的乙個非常重要的技術。當事務在對某個資料物件進行操作前,先向系統發出請求,對其加鎖。加鎖...

ORACLE高階之二 LOCK

資料庫是乙個多使用者使用的共享資源。當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。加鎖是實現資料庫併發控制的乙個非常重要的技術。當事務在對某個資料物件進行操作前,先向系統發出請求,對其加鎖。加鎖...