mysql事務隔離級別
- 讀未提交
一個事務中變更的數據,雖然還未提交,在另一個事務中可以看到變更後的數據 - 讀已提交
當一個事務提交之後,該事務中變更的數據才能在其它事務中看到 - 可重複讀
同一事務中,同一查詢條件多次查詢,數據一致 - 串行化
在一個事務中訪問的行加鎖(讀寫鎖),其它事務出現鎖衝突,阻塞等待前面事務執行完成提交後,再繼續執行
mysql innodb引擎默認事務隔離級別
可重複讀
不同隔離級別出現的問題
- 髒讀
讀未提交情況下,事務A執行過程中讀取到了事務B中更新的數據,隨後事務B回滾了。
不是重點,不說太多。基本也不用這個隔離級別,最少讀已提交。 - 不可重複讀
一個事務中,同一查詢條件語句,前後2次或多次執行查詢,查詢結果數據不一致。
比如:select name from user where id = 1;
在一個事務中第一次查詢,結果是張三,再進行一次查詢結果是李四。 - 幻讀
在一個事務中,2次或多次查詢(範圍查詢),結果行數不一致。
如:select * from user where name=‘張三’;第一次2行,又查一次3行。
或:select * from user where age >20 and age < 30,第一次查詢返回100行,第2次返回101行等。
不可重複讀與幻讀邊界
不可重複讀出現是因爲:一個事務,執行多次查詢的時候,查詢結果被另一個事務給修改了(另一個事務提交了,當前事務還需要再查詢一次),出現結果不一致。
幻讀是因爲:事務A的範圍查詢結果,其它事務在這個範圍內增加相應行了,提交後被事務A看到,行數不一致。
所以,注意,在可重複讀隔離級別下:幻讀僅指新插入行。第二,需要其它事務能看到,該級別一般查詢是快照讀,如果要被看到需要是當前讀(查詢後面加上for update,所有最新變更可以看到).避免幻讀需要再加間隙鎖,相關範圍區間加鎖,其它事務沒法新增記錄就是了(可重複讀級別,間隙鎖生效)。
同樣是結果不一致,區別在這裏。
p.s. 其實到我現在工作爲止,實際業務沒遇到過出現幻讀,概念還是要明白。