理解鎖和閂(1)與鎖相關的資料結構

2021-08-27 06:04:28 字數 1655 閱讀 9637

在oracle眼裡,鎖不是稀有資源,相反地,只要需要,你就應該長期地持有對資料所加的鎖。行級鎖根本沒有相關開銷,對1千萬行鎖定所需的資源數與對1行鎖定所需的資源數完全相同,這是個常量。

佇列資源池:存放所有的佇列資源.鎖就是佇列資源。

例如:乙個表上的tm鎖就是乙個佇列資源,有多少個表就有多少個tm佇列資源,如果有乙個表的tm鎖被持有,他就會被放進佇列資源池。為了對他們加以區分,要為各個表的tm佇列資源起個名字,名字的格式'佇列資源型別-id1-id2『。

例如:

兩個會話修改了同乙個表的不同行,兩個會話並不互相阻塞.表的id是2000,這裡我們以tm鎖為例,佇列資源池中會有乙個空閒條目被占用,其名字是,其資訊包括:佇列資源名和持有者佇列的煉表頭.但真正的兩個持有者的相關資訊,被儲存在鎖池中。

鎖池:會話持有任意乙個佇列資源的資訊,儲存在鎖池中。某乙個佇列資源上的等待者和持有者相關的資訊,並不在佇列資源池中儲存,而是在鎖池擱著。鎖池和佇列資源池中的資訊合一起 稱呼為乙個佇列資源鎖.

10g佇列資源池和鎖池的大小:

sql> select resource_name,initial_allocation from v$resource_limit where resource_name='enqueue_resources';

resource_name initial_allocation

-------------------- --------------------

enqueue_resources 968

如上顯示,10g中預設的佇列資源池初始分配968個條目.每個佇列資源條目在池中只佔很少的資訊,而乙個佇列資源上真正的鎖資訊是記錄在鎖池中的。

上圖是分別在10和12號會話修改6657表後,佇列資源的相關情況,另外,由於佇列資源池中的條目較多,為了能夠快速的在池中查詢某一條目,佇列資源池採用hash表的方式進行查詢.oracle將根據每個條目的佇列資源名,生成乙個hash值,如果想申請某乙個佇列資源上的鎖,會先根據hash值,在hash表中,查詢相關的資源.圖中7b6d5c40就是hash表中記載的在資源佇列池中的位址.以[7b6d5c40,7b6d5c40]這樣的形式記載,是因為某乙個hash值所對應的佇列資源可能不止乙個.這將構成乙個鍊錶,中括號的兩個數字,代表鍊錶的首指標和尾指標.對某乙個hash值下鍊錶的訪問也需要enqueue hash chain閂的保護,在鎖池中就不需要針對鎖池的hash 表咯,因為我們不需要直接在鎖池中搜尋某乙個持有者或等待者.兩個池各有自己的resource free鍊錶來管理空閒的條目.明白了這些有關佇列鎖的資料結構,佇列鎖的獲取和釋放過程就非常簡單了.

資料結構與演算法 資料結構相關的概念

2 資料結構相關的概念 2.1 資料結構 資料結構在特性相同的資料元素集合中,資料元素之間存在一種或多種特定的關係,則稱該資料元素的集合為 資料結構 結構 資料元素之間存在的關係。線性結構 一對一 樹形結構 一對多 網狀或圖形結構 多對對 線性結構條件 1 有且僅有乙個根結點 2 每個結點最對乙個前...

資料結構 BitMap的理解與應用

場景 給出10億個無序不重複整數,對於某個整數m,是否存在於這10億個數內,機器記憶體限定2g,怎麼實現?考慮幾個方面的問題 1.10億個整數的記憶體占用時多大?乙個整型int占用4個位元組 byte 32位 bit 10億個整數的記憶體大小就是 10億 4 byte 1024 kb 1024 m ...

資料結構與演算法1 字首和技巧

基礎型別1 leedcode560 和為k的子陣列 給定乙個整數陣列和乙個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。型別 1 輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。class solution def subarraysum self,...