在瞭解臟讀,不可重覆度,幻讀之前,首先要明白這三種情況的出現都是和資料庫併發事務有關聯的,如果所有的讀寫都按照隊列的形式進行,就不會出現問題。 名詞解析和解決方案 臟讀 臟讀又稱無效數據讀出(讀出了臟數據)。一個事務讀取另外一個事務還沒有提交的數據叫臟讀。 例如:事務T1修改了某個表中的一行數據,但 ...
在瞭解臟讀,不可重覆度,幻讀之前,首先要明白這三種情況的出現都是和資料庫併發事務有關聯的,如果所有的讀寫都按照隊列的形式進行,就不會出現問題。
名詞解析和解決方案
臟讀
臟讀又稱無效數據讀出(讀出了臟數據)。一個事務讀取另外一個事務還沒有提交的數據叫臟讀。
例如:事務T1修改了某個表中的一行數據,但是還沒有提交,這時候事務T2讀取了被事務T1修改後的數據,之後事務T1因為某種原因回滾(Rollback)了,那麼事務T2讀取的數據就是髒的(無效的)。
解決辦法:把資料庫的事務隔離級別調整到READ_COMMITTED(讀提交/不可重覆讀)
不可重覆讀
不可重覆讀是指在同一個事務內,兩次相同的查詢返回了不同的結果。
例如:事務T1會讀取兩次數據,在第一次讀取某一條數據後,事務T2修改了該數據並提交了事務,T1此時再次讀取該數據,兩次讀取便得到了不同的結果。
解決辦法:把資料庫的事務隔離級別調整到REPEATABLE_READ(可重覆讀)
幻讀
幻讀也是指當事務不獨立執行時,插入或者刪除另一個事務當前影響的數據而發生的一種類似幻覺的現象。
例如:系統事務A將資料庫中所有數據都刪除的時候,但是事務B就在這個時候新插入了一條記錄,當事務A刪除結束後發現還有一條數據,就好像發生了幻覺一樣。這就叫幻讀。
解決辦法:把資料庫的事務隔離級別調整到SERIALIZABLE_READ(序列化執行),或者資料庫使用者自己進行加鎖來保證。
題外話:
不可重覆讀出現多是因為修改;幻讀重點是新增、刪除。mysql中的REPEATABLE_READ模式引入了間隙鎖(GAP),解決了幻讀的問題。不論是什麼方式解決幻讀,都會付出一定代價的性能讓步。所以說在業務需求和技術方案之間權衡也是技術人員最需要掌握得技能之一。