DML 執行深入研究

2021-06-07 19:04:31 字數 2627 閱讀 4115

使用者所執行 dml (即執行事務)操作在 oracle 內部按如下順序進行。

1.相應事務分配回滾段( undo segment ), 這時優先使用當前聯機狀態的回滾段中乙個。回滾段的選擇是隨機的,若另外的事務正在使用則重試 3 次, 在此過程中失敗, 則將未聯機的回滾段聯機後使用。 如果此過程也失敗, 就會建立新的回滾段, 通過這個過程也沒有分配到回滾段, 則使用 oracle 8i 中使用的回滾段( rollback segment ) 演算法。即,使用另外事務使用中的回滾段中用量最少的回滾段。 如果伺服器程序在獲得回滾段時沒有適當的聯機狀態的回滾段, 則等待 enq:us-contention 事件, 直到有適當的聯機狀態的回滾段為止。

2.分配回滾段後,在回滾段頭上建立事務表 slot ( transaction table slot )。

3.建立事務表後會生成 txid ( transaction id ),再將此 txid 分配給當前事務。 txid 通過 v$transaction 檢視的 xidusn 、 xidslot 、 xidsqn 表現, 這個值指向分給事務的回滾段頭上存在的事務表的準確位置。事務必須在分配撤銷區域後得到 txid 。

4.事務物件的 資料塊載入到高速緩衝區,在塊頭的 itl ( interested transaction list )上登記事務條目( transaction entry )。如果 itl 上沒有登記條目所需的空間,直到有空間為止,一直等待 enq : tx-allocate itl entry 事件。

5.將需要修改的塊的修改資訊儲存到 pga , 儲存名為 change vector 。修改一行時,一般分別建立撤銷頭塊( change vector#1 )、撤銷塊( change vector#2 )、 資料塊( change vector#3 )相應的 change vector 。 程序將 pga 的 change vector 以名為 redo record (或 redo entry )複製到重做緩衝區。在複製到重做緩衝區的過程中, 需獲得 redo copy 鎖存器、 redo allocation 鎖存器、 redo writing 鎖存器, 在此過程中若發生鎖存器爭用, 分別等待 latch: redo copy 、 latch: redo allocation 、 latch: redo writing 事件。

6.將之前映像資訊( before image ) 記錄到撤銷塊, 繼而修改資料塊, 被修改的資料塊變為髒狀態。 而且, 高速緩衝區上建立關於已修改的資料塊的 cr ( consistent read ) 塊。 如果需修改的行正在被另外事務所改變(即,修改後事務尚未結束的 狀態), 就要等待事務結束, 此時會等待 enq:tx-row lock contention 事件。

7.執行提交( commit )後給事務分配 scn ,提交資訊儲存在重做緩衝區。

8.回滾段頭的事務表中儲存已成功提交的資訊,解除包括 tx 鎖在內的所有資源占有。

9.重做緩衝區的內容記錄在重做日誌檔案上,修改的塊之後被 dbwr 記錄到資料檔案中。

事物執行用偽碼表示如下:

//1.分配回滾段,優先從online undo space中分配

if(online undo segments no space){

for(i=0;i++,i<3){

//新事物從新迴圈申請三次回滾段  

if(新事物還沒有申請到空間){

//聯機offline undo segments,從中分配空間

if(還沒有申請到回滾段空間){

//使用rollback segment演算法,使用另外事物使用中的回滾段中用量最少的回滾段

if(還沒有申請到undo segments){

//則發生enq:us-contention等待事件,直到能夠分配到適當的回滾段為止

//2.在分配到的回滾段頭建立事物表slot(transaction table slot)

//3.生成txid(transaction id),並把txid分配給當前事物

//4.往高速緩衝區載入事物物件關聯的資料塊,在塊頭的til(interested transaction list)上

登記事物條目(transaction entry)

if(如果塊頭上沒有登記itl所需空間){

//則發生enq:tx-allocate-itl entry等待事件,直到有空間為止

//5.往pga儲存修改塊的修改資訊,以change vector的格式,change vector裡面包含(建立撤銷塊頭,撤銷塊,資料塊資訊)

程序將pga的change vector 以名為redo record(或redo entry)複製到重做緩衝區

//6.將之前映像資訊(before image)記錄到撤銷塊,繼而修改資料塊,被修改的資料塊變為髒狀態

並且會在高速緩衝區中建立已修改資料塊的一致讀塊

if(需修改的塊正在被另外事物所改變){

//發生enq:tx-row lock contention等待

事件

//7.執行提交(commit)後給事物分配scn,提交資訊儲存在重做緩衝區。

//8.回滾段頭的事物表中儲存已成功提交的資訊,解除包括tx鎖在內的所有資源占用。

//9.重做緩衝區內容記錄在redo log上,修改該的塊之後被dbwr記錄到資料檔案中。

flex Bindable深入研究

bindable 元資料標籤,它在 中的作用就是向編譯器提供如何編譯程式的資訊。它的最大作用是使程式元件間的資料同步變得容易。在開發中通常用上bindable作用在檢視控制項上,如給它繫結乙個物件,則以後只需要在邏輯層更改這個物件的值,則檢視層的控制項資料會自動更新 同步 而不再需要手動去更新檢視。...

URLRequest深入研究

urlrequest 的乙個例項 html view plain copy create the request.所構建的nsurlrequest具有乙個依賴於快取響應的特定策略,cachepolicy取得策略,timeoutinterval取得超時值 nsurlrequest therequest...

深入研究AsyncTask

asynctask提供了一種在後台執行操作而在ui執行緒顯示結果的方式,而且開發者不必操作執行緒或者handler.乙個asynctask定義了三種泛型分別是params,progress,result,還有四個函式分別是onpreexecute doinbackground onprogressu...