ENQUEUE總結筆記

litterbaby發表於2007-04-01
ENQUEUE總結筆記[@more@]

總結筆記

Oracle鎖的型別

n 資料字典鎖(DDL

n 資料操作鎖(DML

n 內部鎖和閂

n 分散式鎖

n 並行快取管理鎖

佇列是一個服務,是由kernel Service Enqueues (KSQ)層來提供。其他層在使用的是呼叫這個層的函式來使用。佇列是一種用來管理共享資源聯絡的機制。是一個本地的能夠序列連線共享資源的鎖。這些共享資源可以使重做執行緒,表和事務。這種管理方式可以在一個例項上使用,也可以在所有的例項上實現。

在佇列的使用中,有請求,轉換和釋放佇列的使用方式和過程。如果這個佇列不能立即被使用的話,客戶層將選擇等待或者超時。

佇列標識

每一個佇列都有一個唯一的名字來進行標識,這個也可以認為是鎖或者資源的名字。標識由三部分構成:

Type:是一個兩個位元組的字串,例如:TM

ID12:是一個4位元組的正值。

不同型別的佇列服務ID12是由不同的定義。這些資料可以透過查詢檢視v$lock來檢視到:

SQL> select type,id1,id2 from v$lock;

TYPE ID1 ID2

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

MR 202 0

MR 8 0

MR 5 0

MR 4 0

MR 3 0

MR 1 0

RT 1 0

XR 4 0

TS 2 1

9 rows selected

佇列模式

例如對於DML鎖來說:

SS = Row Share (lock a row in shared mode)

SX = Row Exclusive (lock a row in exclusive mode)

S = Share (lock the entire table in shared mode)

SSX = Share Row Exclusive (lock the table in shared mode but a row in exclusive)

X = Exclusive (lock the entire table in exclusive mode)

SS = 行鎖(在共享模式下鎖一行)

SX = 行排他鎖(在排他模式下鎖一行)

S = 共享(在共享模式下鎖一個表)

SSX = 共享行排他(在共享模式下鎖一個表但是一個行是排他的)

X = 排他(整個表在排他模式下鎖)

佇列的相容性

如下表所示,這裡主要是為了下一步的佇列的請求,轉換和釋放提供一個參考。

Held/Get

NULL

SS

SX

S

SSX

X

NULL

SS

SX

S

SSX

X

佇列的請求,轉換和釋放是有會話來控制的,並不是一個程式,這一定是很好理解的,事務是在會話的基礎之上的。對於每一個佇列是一個資源結構,主要包含和維護著擁有者,等待,轉換的一個列表。而每一個擁有者,等待,轉換都有一個鎖結構。

鎖和資源表被分配在SGA中,在資源表中的總的行數是由初始化引數enqueue_resources來確定。這些行能夠在表x$ksqrs中看到,使用的值可以查詢v$resource

enqueue_resources這個引數是設定能夠被鎖管理器並行鎖的資源的數量。

_enqueue_locks 這個引數是在佇列鎖表中所有行數,可以在x$ksqeq中查詢到,v$enqueue_lock.

SQL> select * from x$ksqrs;

ADDR INDX INST_ID KSQRSID1 KSQRSID2 KSQRSIDT KSQRSFLG

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

7A2DDA38 0 1 1245220 8 TX 4

7A2DDA8C 1 1 0 1 IS 0

7A2DDAE0 2 1 0 0 IS 0

7A2DDB34 3 1 4 0 XR 2

7A2DDB88 4 1 0 0 CF 0

7A2DDBDC 5 1 0 4 CF 0

7A2DDC30 6 1 2033875140 2033875140 CU 0

7A2DDC84 7 1 2033703204 2033703204 CU 0

SQL> select * from v$resource;

ADDR TYPE ID1 ID2

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

7A2DDB34 XR 4 0

7A2DDD2C RT 1 0

7A2DDE28 MR 3 0

7A2DDE7C MR 5 0

7A2DE020 MR 1 0

7A2DE074 MR 4 0

7A2DE0C8 MR 8 0

7A2DE170 MR 202 0

7A2DF2A0 TA 6 9

7A2DFE80 TS 2 1

資源結構:

如上圖所示:這個資源結構包含著資源名和三個連線列表,擁有列表包含對這個資源已經請求得到的鎖的會話的鎖結構,等待列表包含著沒有在這個資源上的鎖,但是正在請求的鎖結構。

佇列的分類

佇列有兩個不同的型別:

客戶佇列

鎖結構是由客戶層分配,例如DML鎖(TM)。

管理佇列

鎖結構是由KSQ自身分配。例如:媒介恢復佇列(MR

這兩種佇列的不同主要是鎖資料結構的位置不同。管理佇列一般由固定或者限制數量的鎖組成。下表就是詳細分類:

Client or User Enqueues

TM: DML enqueue

TX: Transaction enqueue

UL: User supplied

Managed or System Enqueues

BL: Buffer Cache Management

CF: Controlfile Transaction

CI: Cross-instance Call Invocation

CU: Bind Enqueue

DF: Datafile

DL: Direct Loader Index Creation

DM: Database Mount

DR: Distributed Recovery

DX: Distributed TX

FS: File Set

IN: Instance Number

IR: Instance Recovery

IS: Instance State

IV: Library Cache Invalidation

JQ: Job Queue

KK: Redo Log “Kick”

L[A–P]: Library Cache Lock

MR: Media Recovery

N[A–Z]: Library Cache Pin

PF: Password File

PI: Parallel Slaves

PR: Process Startup

PS: Parallel Execution Process Synchronization

Q[A–Z]: Row Cache

RT: Redo Thread

SC: System Commit Number

SM: SMON

SQ: Sequence Number Enqueue

SR: Synchronized Replication

SS: Sort Segment

ST: Space Management Transaction

SV: Sequence Number Value

TA: Transaction Recovery

TS: Temporary Segment (also TableSpace)

TT: Temporary Table

UN: User Name

US: Undo Segment, Serialization

WL: Being Written Redo Log

XA: Instance Attribute Lock

XI: Instance Registration Lock

狀態物件

所有的鎖結構被嵌入一個狀態物件,目的是在程式失效的時候允許PMON來恢復這個鎖結構。客戶鎖結構被嵌入客戶化的狀態物件,例如:

1、 DML鎖(TM)結構被嵌入DML鎖狀態物件。

2、 事務鎖結構(TX)被嵌入事務鎖狀態物件。

管理鎖結構被嵌入了佇列狀態物件。

所有的資源結構組成了資源表,為了在資源表中找到相應的資源,Oracle在這裡使用的是一種hash演算法。就是利用資源名()來進行hash,(這裡使用的是一個hash函式,這個hash函式是將資源名轉換為一個索引)從而在hash塊找到所要查詢的資源。每一個hash bucket是有一個資源的連線列表(hash鏈)而組成。

這個hash鏈是由一個或者多個latches來維護的(enqueue hash chains的子閂),是由round-robin來分配。

鎖的請求

鎖的請求是在會話準備獲取一個鎖但是沒有得到的時候發生。一個會話在一下的狀態上允許得到一個鎖:

1、 在這個地前面沒有需要轉換或者等待的

2、 這個請求的模式&現在已經獲得鎖的會話的模式相容的話,就可以得到這個鎖

不符合上述的話,會話請求將會在等待佇列中等待

請求的詳細步驟:

1、 使用hash函式來確定請求資源的連線列表的位置

2、 獲得相應的enqueue hash chain

3、 定位資源,或者如果資源不存在的話,查詢空閒的資源結構並將他放置在這個連線列表上。

4、 獲得enqueues閂;

5、 提供空閒的鎖結構;

6、 使用你所請求的資源正確的資訊來組裝

7、 連線鎖結構到資源結構上

8、 釋放enqueues

9、 釋放enqueue hash chain

鎖轉換

鎖轉換髮生在一個會話請求改變當前保持的狀態。在下面的情況下允許轉換一個鎖:

1、 需要轉換的狀態是已經保持狀態的子集模式

2、 需要轉換的狀態和被其他會話當前正在保持的狀態相容;

鎖的釋放

釋放的詳細步驟:

1、 使用hash函式來確定請求資源的連線列表的位置

2、 獲得相應的enqueue hash chain

3、 定位資源

4、 獲得enqueues

5、 解除資源上的鎖結構的連線

6、 連線鎖結構到鎖空閒列表上

7、 釋放enqueues

8、 執行下一個轉換或者等待得鎖結構

9、 如果可能的話將資源結構從hash鏈上脫離連線,將這個資源結構連線到資源空閒列表上。

10、 釋放enqueue hash chain

從上面的操作來看,有這麼幾個資料結構:

n Hash bucket

n 資源結構

n 鎖結構

相對應的有幾個列表:

n Hash 列表

主要是為了連線hash bucket

n 資源結構空閒列表

這裡存在這樣的一個列表,可以使用資源的使用和釋放,這個應該是用某一個初始化引數來決定資源的數量。在資源表中的總的行數是由初始化引數enqueue_resources來確定。這些行能夠在表x$ksqrs中看到,使用的值可以查詢v$resource

enqueue_resources這個引數是設定能夠被鎖管理器並行鎖的資源的數量。

n 鎖結構空閒列表

這個空閒列表示用於鎖結構資源的使用&釋放。_enqueue_locks 這個引數是在佇列鎖表中所有行數,可以在x$ksqeq中查詢到,v$enqueue_lock.

佇列的操作

1、 在一個新的鎖被請求的時候,Oracle伺服器將檢查驗證這個佇列,看看這個請求是否被授權。

2、 當一個鎖被釋放或者被轉換的時候,轉換器和等待器也被重新檢查,來看看他們是否能被請求。

3、 轉換器佇列首先被處理,隨後是等待佇列。

等待事件:enqueue

當一個會話等待一個本地佇列的時候,將會找到佇列等待時間的產生。我們可以透過查詢檢視v$session_wait來發現這個等待時間。

select event, total_waits, total_timeouts

from v$system_event

where event = 'enqueue';

調整佇列等

1、調整enqueue等待事件依賴於造成等待enqueue的型別;調整enqueue等待事件很大程度上是依賴於造成等待enqueue的型別。

2、可能的解決辦法為:

a 減少enqueue的請求量

例如SQ佇列主要原因是由於sequence有關,如果在記憶體中被請求的序列有幾個值得話,就可以從一定程度上緩解這種佇列的產生。所以解決的方法是透過增加序列的快取。再如ST佇列實有關於字典表空間管理方式下,空間事務的請求有關,這樣的解決方式就是我們可以透過將空間轉換為本地管理表空間,減少衝突的產生等情況來解決。

b 減少enqueue保持的時間

例如CF佇列必須是在更新控制檔案時候必須被保持的狀態,主要原因是有太多的控制檔案的複製,更新他們就需要太多的保持enqueue的時間,解決的辦法是減少控制檔案的數目。

診斷佇列的指令碼:

prompt ***************************************************************************

prompt enqueue的調查和分析

prompt ***************************************************************************

prompt 建議:

prompt 1、調整enqueue等待事件依賴於造成等待enqueue的型別;

prompt 2、可能的解決辦法為:

prompt a 減少enqueue的請求量

prompt b 減少enqueue保持的時間

prompt TM: DML enqueue

prompt TX: Transaction enqueue

prompt UL: User supplied

prompt

prompt BL: Buffer Cache Management

prompt CF: Controlfile Transaction

prompt CI: Cross-instance Call Invocation

prompt CU: Bind Enqueue

prompt DF: Datafile

prompt DL: Direct Loader Index Creation

prompt DM: Database Mount

prompt DR: Distributed Recovery

prompt DX: Distributed TX

prompt FS: File Set

prompt IN: Instance Number

prompt IR: Instance Recovery

prompt IS: Instance State

prompt IV: Library Cache Invalidation

prompt JQ: Job Queue

prompt KK: Redo Log “Kick”

prompt L[A–P]: Library Cache Lock

prompt MR: Media Recovery

prompt N[A–Z]: Library Cache Pin

prompt PF: Password File

prompt PI: Parallel Slaves

prompt PR: Process Startup

prompt PS: Parallel Execution Process Synchronization

prompt Q[A–Z]: Row Cache

prompt RT: Redo Thread

prompt SC: System Commit Number

prompt SM: SMON

prompt SQ: Sequence Number Enqueue

prompt SR: Synchronized Replication

prompt SS: Sort Segment

prompt ST: Space Management Transaction

prompt SV: Sequence Number Value

prompt TA: Transaction Recovery

prompt TS: Temporary Segment (also TableSpace)

prompt TT: Temporary Table

prompt UN: User Name

prompt US: Undo Segment, Serialization

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/222350/viewspace-908008/,如需轉載,請註明出處,否則將追究法律責任。

下一篇: 鎖的總結筆記
ENQUEUE總結筆記
請登入後發表評論 登入
全部評論

相關文章