揭祕Mysql事務隔離級別之可重複讀
揭祕Mysql事務隔離級別之可重複讀
1.可重複讀的來源
知其源可以知其流,而因其流亦可溯其源,欲搞清楚什麼是可重複讀,必先知道可重複讀是怎麼來的的,這就引出了不可重複讀。
2.何為不可重複讀
老師說過,瞭解一項技術或搞懂一個名詞的最佳方法是百度百科,因此獻上百度百科:
注意劃線部分,這是重點,敲黑板啦!!!
“在一個事務內”,“在這個事務還沒有結束時”。那麼問題來了,究竟如何才能做到在一個事務內呢?
這個答案,多虧了培訓的老師:在mysql中,事務是自動提交的,要想設定事務不自動提交,就得開啟一個事務:start transaction;
,然後,在這段程式碼之後,commit
commit
提交事務,事務就沒有結束。
3.那麼可重複讀和不可重複讀究竟有什麼關係呢?
答案揭曉:可重複讀就是為了解決不可重複。乍一看不可重複讀不是個好現象。有百度百科可以知道,假如有兩個執行緒(開啟兩個mysql客戶端模擬兩個執行緒),執行緒1使用start transaction;
後多次使用select語句查詢某條記錄,我們希望的是在事務結束之前,同樣的select語句查詢同一條記錄不會發生改變,但是,如果你的資料庫設定的隔離級別不是可重複讀而是讀已提交或者更低一級的讀未提交,那麼當另一個執行緒2使用update,delete等修改執行緒1要查詢的那條記錄的時候,線上程1事務結束之前使用同樣的select語句查詢同一條記錄就會發生改變,這就是不可重複讀現象。而當資料庫設定的隔離級別是可重複讀時,就不會出現不可重複讀現象,即線上程1事務結束之前使用同樣的select語句查詢同一條記錄不會發生改變。
4.模擬不同事務隔離級別對不可重複的處理情況(有執行緒執行順序)。
4.1.讀已提交級別:
執行緒2:
檢視資料庫的隔離級別:
更改資料庫隔離級別:
查詢某條記錄:
執行緒1使用exit
再重新使用mysql -u使用者名稱 -p密碼
登入,避免快取干擾實驗結果,第二個實驗同此操作。
執行緒:1:開啟事務(關閉事務自動提交)
執行緒2:
執行緒1:事務未結束,結果被更新
查詢後再使用commit
結束事務。
繼續使用上一個實驗的用例。
4.2.可重複讀級別:
執行緒2:
執行緒1:
執行緒2:
執行緒1:事務結束之前,結果仍未改變
5.總結
實驗成功,可重複讀隔離級別解決不可重複現象
不太明白事務隔離級別的參考以下文章: