瞭解Oracle的簡單事務(2014年3月18日自學筆記)

The薩滿發表於2014-03-18


一個Oracle簡單事務

         1:使用者首先使用Oracle net service通過網路層,基於WEB等方式訪問到資料庫中。

         2:此時資料庫會檢查使用者帳號密碼等資訊。如果資訊正確,伺服器會分配一個伺服器程式給這個使用者。

         3:當使用者執行一些操作時,Oracle資料庫會在資料庫緩衝區中檢視使用者的可執行許可權,如果沒有需要從資料檔案中讀取到資料庫緩衝區中。

         4:如果使用者有這個許可權,Oracle會檢查使用者的SQL語句之前是否有執行過,或者在共享池中,若是會執行此SQL語句,若不是,Oracle

       再次分析此SQL語句後再執行,並且會在使用者會話的PGA中建立一個私有的SQL區域。

         5:為了防止其他使用者再次更改相同行,Oracle會施加行級鎖。

         6:由於使用者有更改資料,那麼會在日誌緩衝區中產生更改向量,並且更改資料會在資料庫高速緩衝區中進行。

         7:使用者這時會執行COMMIT操作,讓更改永久生效。此時會話會處於掛起狀態,這時重做日誌緩衝區會被寫入聯機重做日誌檔案中。

         8:日誌寫完後,返回給客戶執行成功的訊息。

 

瞭解下提交事務,回滾事務

         1:提交事務:提交事務也就是COMMIT操作,執行的SQL語句所做的更改操作將永久生效。

執行COMMIT操作之前資料庫內部做以下工作:

         A:生成撤銷資料,這些撤銷資料也就是更改前的資料,存放在undo表空間中。(用於rollback操作)。

         B:由於產生更改向量,所以在重做日誌緩衝區中的更改資訊會被寫入聯機重做日誌檔案中,

         C:快取區中的資料將被更改。(不一定會馬上寫入資料檔案中,因為DBWN使用極懶的演算法來寫入)。

         D:當緩衝區資料被寫入資料檔案後SCN號寫入其中,此時LGWR也在日誌檔案中分配一個SCN(標記事務正式提交的作用)。

         F:然後釋放行級鎖,事務被標記正式完成。

2:回滾事務:使用rollback命令,撤銷未提交的事務,使其恢復到更改前的資料,撤銷完成後行級鎖也會被釋放。

         什麼時候會出現rollback操作呢:

         A:使用者自己執行的撤銷操作。

         B:未提交事務突然中斷,此時系統會回滾這些更改操作。

         C:或者系統出現內部錯誤,這時也會回滾資料。

 

瞭解事務的特性

事務有4大特性:原子性,一致性,隔離性,永續性。

1:原子性:一個事務要麼完全執行,要麼完全不執行。假如事務執行到一半遇到突發問題停止了,那麼整個事務將完全不執行。

2:一致性:如果事務執行之前是一致的,那麼事務執行之後也必須是一致的,所謂的事務的一致性,也就是事務的完整性。

3:隔離性:事務的執行不受其他事務的干擾,事務執行的中間結果對其他事務必須是透明的,隔離性由併發控制來支援。

         4:永續性:事務的永續性保證了提交的事務將永久儲存在資料庫中。資料恢復技術將保證事務永續性。

 

因為一個資料庫有很多人同時訪問同一個表,為了讓不同使用者之間不受影響,Oracle通過鎖定表的方式來隔離每個事務,這就是併發控制,但這種鎖定採用最少限制的方式。

 

瞭解併發控制

         因為一個Oracle資料庫同時受多個使用者訪問,為了讓多個使用者同時訪問同一個表,就需要併發控制來隔離每個獨立的事務(Oracle的併發控制採用最少的限制方式)

 

併發控制帶來的問題

1:髒問題:當A使用者更改一個表的值,但還未提交。此時B讀取這個新值,但由於某種原因A使用者回滾了事務。

              那麼就會造成B使用者讀取的值為錯誤的。

         2:幻讀問題:當A使用者讀一個表時只有一行,此時B使用者插入新行,使用者A又重新查詢了這個表,此時對A

                 說多出1行,這就是幻讀。

         3:更新丟失問題:使用者A查詢表的一行資料,使用者B此時也查詢與A同一行資料,此時使用者A修改此資料並且

                 提交,使用者B緊接著也修改這行資料並且提交。這時A所做的修改將丟失,因為被B使用者所覆蓋。

         4:不可重複讀(模糊讀)問題:當A使用者發現之前讀的行已經被其他使用者修改了。不可重複讀的問題就出現了。

 

瞭解隔離級別

         隔離級別的提出可以使併發控制與隔離執行之間的矛盾得到一個平衡。因為隔離程度越高,資料庫的併發性越差;隔離程度越低,資料庫的併發性越好。

         Oracle隔離級別含義:

         1:序列:序列級別就是事務之間完全隔離,排隊輪流執行。通過鎖定機制,解決了髒讀,幻讀,不可重複讀的問題。

         2:可重複讀:這個隔離級別就是讀一致性的意思,同一個事務2個不同的時間點,讀取的資料都是一樣的。解決了髒讀,不可重複讀的問題。

         3:未提交讀:也就是可以讀取髒資料,就是指中間資料。這樣併發控制的問題可能會全部體現出來。

         4:已提交讀:Oracle預設情況下是語句級的已提交讀。只讀取會話前已提交的資料。不會有髒問題的存在。

 

 

 

 

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

相關文章