數據庫事務基礎

併發事務引發的問題

1. 更新丟失(Lost Update)面試

兩個事務都同時更新一行數據,可是第二個事務卻中途失敗退出,致使對數據的兩個修改都失效了。這是由於系統沒有執行任何的鎖操做,所以併發事務並無被隔離開來。數據庫

2. 髒讀(Dirty Read)併發

又稱無效數據讀出。一個事務讀取另一個事務尚未提交的數據叫髒讀。性能

例如:事務T1修改了一行數據,可是尚未提交,這時候事務T2讀取了被事務T1修改後的數據,以後事務T1由於某種緣由Rollback了,那麼事務T2讀取的數據就是髒的。spa

3. 不可重複讀(Non-Repeatable Read)blog

是指在一個事務中兩次讀同一行數據,但是這兩次讀到的數據不同。事務

例如:事務T1讀取某一數據,事務T2讀取並修改了該數據,T1爲了對讀取值進行檢驗而再次讀取該數據,便獲得了不一樣的結果。it

4. 幻讀table

事務在操做過程當中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的數據或者缺乏了第一次查詢中出現的數據基礎

例如:系統管理員A將數據庫中全部學生的成績從具體分數改成ABCDE等級,可是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺同樣。這就叫幻讀。

不可重複讀重點在於update和delete,而幻讀的重點在於insert。因此說不可重複讀和幻讀最大的區別,就在於如何經過鎖機制來解決他們產生的問題。

事務隔離級別有哪些?

(更新丟失、髒讀、不可重複讀、幻讀)都和事務的隔離級別有關。經過設置事務的隔離級別,能夠避免上述問題的發生。

1. 讀未提交(Read Uncommitted)

讀事務不阻塞其餘讀事務和寫事務,未提交的寫事務阻塞其餘寫事務但不阻塞讀事務。

此隔離級別能夠防止更新丟失,但不能防止髒讀、不可重複讀、幻讀。

此隔離級別能夠經過「排他寫鎖」實現。

2. 讀已提交(Read Committed)

讀事務容許其餘讀事務和寫事務,未提交的寫事務禁止其餘讀事務和寫事務。

此隔離級別能夠防止更新丟失、髒讀,但不能防止不可重複讀、幻讀。

此隔離級別能夠經過「瞬間共享讀鎖」和「排他寫鎖」實現。

3. 可重複讀取(Repeatable Read)

以操做同一行數據爲前提,讀事務禁止其餘寫事務但不阻塞讀事務,未提交的寫事務禁止其餘讀事務和寫事務。

此隔離級別能夠防止更新丟失、髒讀、不可重複讀,但不能防止幻讀。

此隔離級別能夠經過「共享讀鎖」和「排他寫鎖」實現。

4. 序列化(Serializable)

提供嚴格的事務隔離,它要求事務序列化執行,事務只能一個接着一個地執行,不能併發執行。

此隔離級別能夠防止更新丟失、髒讀、不可重複讀、幻讀。

若是僅僅經過「行級鎖」是沒法實現事務序列化的,必須經過其餘機制保證新插入的數據不會被剛執行查詢操做的事務訪問到。

可串行化:若是一個並行調度的結果等價於某一個串行調度的結果,那麼這個並行調度是可串行化的。

隔離級別越高,越能保證數據的完整性和一致性,可是對併發性能的影響也越大。對於多數應用程序,能夠優先考慮把數據庫系統的隔離級別設爲Read Committed。它可以避免更新丟失、髒讀,並且具備較好的併發性能。儘管它會致使不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,能夠由應用程序採用悲觀鎖或樂觀鎖來控制。

用一張圖來闡述不一樣事務隔離級別在針對事務併發問題方面的解決能力:

Java面試精講:數據庫事務基礎

相關文章
相關標籤/搜索