資料庫事務隔離級別

00潤物無聲00發表於2016-10-23

  事務的特徵ACID中,I是指Isolation,隔離性,即併發事務之間相互影響的程度。當事務併發操作時,可能出現髒讀,不可重複讀,幻讀,而事務的隔離級別能夠相應的解決出現的問題。



  髒讀:事務A修改了一個資料,但未提交,事務B讀到了事務A未提交的更新結果,如果事務A提交失敗,事務B讀到的就是髒資料。


  不可重複讀:在同一個事務中,對於同一份資料讀取到的結果不一致。

    事務B在事務A提交前讀到的結果,和提交後讀到的結果可能不同。

    出現的原因就是事務併發修改記錄。

    要避免這種情況,最簡單的方法就是對要修改的記錄加鎖,這回導致鎖競爭加劇,影響效能。


  幻讀:在同一個事務中,同一個查詢多次返回的結果不一致。

    事務A新增了一條記錄,事務B在事務A提交前後各執行了一次查詢操作,發現後一次比前一次多了一條記錄。

    幻讀是由於併發事務增加記錄導致的

    這個不能像不可重複讀通過記錄加鎖解決,因為對於新增的記錄根本無法加鎖。需要將事務序列化,才能避免幻讀。


事務的隔離級別從低到高有:


  Read Uncommitted:最低的隔離級別,什麼都不需要做,一個事務可以讀到另一個事務未提交的結果。所有的併發事務問題都會發生。


  Read Committed:只有在事務提交後,其更新結果才會被其他事務看見。可以解決髒讀問題。


  Repeated Read:在一個事務中,對於同一份資料的讀取結果總是相同的,無論是否有其他事務對這份資料進行操作,以及這個事務是否提交。可以解決髒讀、不可重複讀。


  Serialization:事務序列化執行,隔離級別最高,犧牲了系統的併發性。可以解決併發事務的所有問題。


隔離級別和解決的程度

隔離等級

髒讀

不可重複讀

幻讀

讀未提交

YES

YES

YES

讀已提交

NO

YES

YES

可重複讀

NO

NO

YES

序列化

NO

NO

NO


總結:

  事務的提出主要是為了解決併發情況下保持資料一致性的問題。通過選用不同的隔離等級就可以在不同程度上避免事務處理中所面臨的各種問題。但是隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為Read Committed,它能夠避免髒讀取,而且具有較好的併發效能。





相關文章