事務的隔離性理解
事務的隔離性理解
事務處理之父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提交前讀到的結果,和提交後讀到的結果可能不同。不可重複讀出現的原因就是事務併發修改記錄
Repeated Read可以解決不可重複讀問題和髒讀問題,但仍無法解決下面的問題。
3、幻讀(Phantom Read) : 在同一個事務中,同一個查詢多次返回的結果不一致。事務A新增了一條記錄,事務B在事務A提交前後各執行了一次查詢操作,發現後一次比前一次多了一條記錄。幻讀僅指由於併發事務增加記錄導致的問題,這個不能像不可重複讀通過記錄加鎖解決,因為對於新增的記錄根本無法加鎖。需要將事務序列化,才能避免幻讀。
Serialization解決了以上所有問題,但是效能效率較低。
通常來說,事務隔離級別越低,所需持有鎖的時間也就越短,併發效能也就越好。