MySQL數據庫之事務隔離級別

隔離級別

引言:
在數據庫操作中,隔離性是一種很重要的特性,涉及到併發處理。在SQL標準中,一共是有四種隔離級別的,越低的隔離級別通常也可以做到更高的併發處理,系統對其進行開銷也更小。

一、READ UNCOMMITTED(未提交讀)

在這種級別之中,事務的修改,即便是沒有提交,也是對其他的事務是可見的。事務可以讀取沒有提交的數據,這也是髒讀,因爲事務沒有提交,但可以讀取到,這會產生髒數據。從性能上說,READ UNCOMMITED 不會比其他的級別好很多,但是卻缺少了別的級別的很多的好處,所以說,一般實際應用,不採用這種級別。

\color{#FF0000}{缺點:} 造成髒讀等一系列的問題。
\color{#FF0000}{優點:} 性能稍微好一點。

二、READ COMMITED(提交讀)

大多數的數據庫系統的默認隔離級別都是該級別,but我們的MySQL並非是該級別。 READ COMMITTED滿足前面提到的隔離性的簡單定義,即一個事務開始的時候,只能夠“看見”已經提交過得事務所做的修改,也就是一個事務在提交前,所對數據做的任何修改都是對其他事務不可見的。但是在該級別中,仍會產生一個問題,即兩次執行同樣的查詢,結果可能不一樣。故又稱爲不可重複讀。

兩次執行同樣查詢,結果不一樣原因:可以理解爲:兩次查詢爲一個事務,講該事務的處理拉長,在此事務處理的中間,仍然有其他的事務進行修改數據,並且提交了,這個時候,在這個事務中,雖然兩次查詢是一樣的,但是查詢到的結果集不一樣。
\color{#FF0000}{即我在事務中讀的時候,別人插進來進行操作數據。}

\color{#FF0000}{缺點:} 雖然不會髒讀,但是卻存在不可重複讀的問題。
\color{#FF0000}{優點:} 解決了髒讀的問題。

三、REPEATABLE READ(可重複讀)

該級別即解決了髒讀問題,也解決了不可重複讀問題,且該級別是MySQL數據庫的默認事務隔離級別。

我在事務操作的時候,不允許別的事務對我要操作的數據進行操作,這樣子,即便對數據進行多次查詢操作,也不會產生不可重複讀的問題。

但是會產生一個幻讀問題,即某一個事務在讀取一個範圍內的記錄的時候,另外的事務在該範圍內插入新的數據,那麼當之前的數據再次讀取該範圍的記錄的時候,會發現後一次查詢看到前一次查詢沒有看見的行。這行如同幻覺一樣產生。

在InnoDB和XtraDB存儲引擎中,通過多版本併發控制(MVCC)解決幻讀問題,有機會再講。

\color{#FF0000}{缺點:} 會出現幻讀。
\color{#FF0000}{優點:} 解決了髒讀,不可重複讀的問題。

四、SERIALIZABLE(可串行化)

事務中最高的隔離級別,通過強行將事務串行執行,避免產生幻讀的問題,簡單來說,SERIALIZABLE會在讀取的每一行的數據的時候都加上鎖,也就是說,我在執行事務的時候,你連看的機會都沒有,在這個事務沒有操作完成,別的事務只能等待操作完成。

在實際應用之中,很少採用,除非非常需要確保數據的一致性,而且得接收沒有併發,纔會考慮該級別。

\color{#FF0000}{缺點:} 不能併發,容易導致大量的超時和鎖爭用的問題,容易死鎖。
\color{#FF0000}{優點:} 解決上述問題。

五、各數據庫默認處理級別

MySQL:REPEATABLE READ
SQL SERVER:READ COMMITTED
Oracle:READ COMMITTED

如有錯誤,望指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章