1. 程式人生 > >事務的隔離性理解

事務的隔離性理解

事務的隔離性理解

事務處理之父Jim Gray對事務隔離性的定義:

Isolation: Concurrently executing transactions see the stored information as if they were running serially (one after another).

 

 

事務的隔離級別從低到高有:
Read Uncommitted:最低的隔離級別,什麼都不需要做,一個事務可以讀到另一個事務未提交的結果。所有的併發事務問題都會發生。
Read Committed:只有在事務提交後,其更新結果才會被其他事務看見。可以解決髒讀問題。
Repeated Read

:在一個事務中,對於同一份資料的讀取結果總是相同的,無論是否有其他事務對這份資料進行操作,以及這個事務是否提交。可以解決髒讀、不可重複讀。
Serialization:事務序列化執行,隔離級別最高,犧牲了系統的併發性。可以解決併發事務的所有問題。
通常,在工程實踐中,為了效能的考慮會對隔離性進行折中。

 

其中只有serialization實現隔離性所有要求,在真正實現事務的隔離性。

但考慮到實踐,為了效能,資料庫廠商做出了這方面的妥協,讓使用者可以選擇隔離的級別。

不同的隔離級別可以解決不同階段的問題,是層層遞進,逐漸增強的關係。

 

隔離性為了解決的問題主要有三個(將事務的隔離級別和問題聯絡在一起理解):

        1、 髒讀(Drity Read):事務A修改了一個數據,但未提交,事務B讀到了事務A未提交的更新結果,如果事務A提交失敗,事務B讀到的就是髒資料。

   Read Committed可以解決髒讀問題,但仍存在以下兩種問題。

         2、不可重複讀(Non-repeatable read) : 在同一個事務中,對於同一份資料讀取到的結果不一致。比如,事務B在事務A提交前讀到的結果,和提交後讀到的結果可能不同。不可重複讀出現的原因就是事務併發修改記錄

,要避免這種情況,最簡單的方法就是對要修改的記錄加鎖,這導致鎖競爭加劇,影響效能。(另一種方法是通過MVCC可以在無鎖的情況下,避免不可重複讀。待了解。。)

   Repeated Read可以解決不可重複讀問題和髒讀問題,但仍無法解決下面的問題。

         3、幻讀(Phantom Read) : 在同一個事務中,同一個查詢多次返回的結果不一致。事務A新增了一條記錄,事務B在事務A提交前後各執行了一次查詢操作,發現後一次比前一次多了一條記錄。幻讀僅指由於併發事務增加記錄導致的問題,這個不能像不可重複讀通過記錄加鎖解決,因為對於新增的記錄根本無法加鎖。需要將事務序列化,才能避免幻讀。

   Serialization解決了以上所有問題,但是效能效率較低。
   通常來說,事務隔離級別越低,所需持有鎖的時間也就越短,併發效能也就越好。