mysql事務詳解

mysql事務是指將數據庫從一種一致性狀態轉到另一種一致性狀態

mysql事務具有ACID特性:

原子性(Atomicity):事務中的所有操作,要麼全部執行,要麼都不執行
一致性(Consistency):事務開始和結束後,數據庫的完整性不會被破壞
隔離性(Isolation):事務之間互不影響。事務的隔離級別有四種:讀未提交、讀已提交、可重複讀(默認隔離級別)、串行化
持久性(Durability):事務提交後,對數據的修改是永久性的,即使系統故障也不會丟失

一 數據庫事務的隔離級別

讀未提交(read uncommited):最低的隔離級別。一個事務可以讀取另一個事務並未提交的更新結果。即事務對數據庫數據所做的修改,在事務未提交之前,可以被其他事務看到。A事務對數據庫數據做的修改,在A事務未提交時,事務B可讀到A事務對數據所做的修改。
容易產生的問題:髒讀。由於事務B可讀到事務A所做的修改,但是A並沒有提交,如果事務A執行過程中發生異常回滾,則會導致事務B讀到的是錯誤數據,即髒數據

讀已提交(read commited):大部分數據庫採用的默認隔離級別。一個事務的更新操作結果只有在該事務提交之後,另一個事務纔可以的讀取到同一筆數據更新後的結果。A、B兩個數據同時對數據庫中同一條數據做修改,A事務開啓,讀取數據,此時,B事務也開啓,讀取數據,並對數據做出修改,然後提交,此時事務A繼續執行,執行完後,再次讀取數據,發現兩次讀取的結果不一樣,由此產生不可重複讀的問題。

可重複讀(repeatable read):mysql的默認級別。整個事務過程中,對同一筆數據的讀取結果是相同的,不管其他事務是否在對共享數據進行更新,也不管更新提交與否。A事務讀取數據庫數據,在處理業務的過程中事務B讀取數據並修改完成後,事務A再次讀取數據時,所得結果和之前讀取的數據一致,並且事務A提交後,不會損害數據的一致性。可能產生的問題:幻讀。如:事務A開啓,讀取用戶x的age爲15,B事務開啓age讀取用戶x的age並加1,此時用戶x的age爲16,A事務繼續執行,將用戶x的age加1,提交後,發現x用戶的age值爲17.從用戶的角度來看,數據的一致性並沒有被破壞,但A事務可能將讀取到的數據15返回給用戶,導致幻讀。

串行化(serializable):最高隔離級別。所有事務操作依次順序執行。注意這會導致併發度下降,性能最差。通常會用其他併發級別加上相應的併發鎖機制來取代它。表上的一個事務開啓後,在該事務提交之前,其他事務不能對錶中的數據做任何修改。該隔離級別會鎖表。

二 不同事務級別帶來的併發問題

1 髒讀
髒讀發生在一個事務A讀取了被另一個事務B修改,但是還未提交的數據。假如B回退,則事務A讀取的是無效的數據。這跟不可重複讀類似,但是第二個事務不需要執行提交。

2 不可重複讀
不可重複讀的重點是修改: 同樣的條件, 你讀取過的數據, 再次讀取出來發現值不一樣了
在基於鎖的並行控制方法中,如果在執行select時不添加讀鎖,就會發生不可重複讀問題。
在多版本並行控制機制中,當一個遇到提交衝突的事務需要回退但卻被釋放時,會發生不可重複讀問題。

3 幻讀
幻讀的重點在於新增或者刪除 (數據條數變化)。同樣的條件, 第1次和第2次讀出來的記錄數不一樣
幻讀發生在當兩個完全相同的查詢執行時,第二次查詢所返回的結果集跟第一個查詢不相同。
發生的情況:沒有範圍鎖。

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