您好,登錄后才能下訂單哦!
本篇內容介紹了“mysql中臟讀、不可重復讀和幻讀的概念”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
在現代關系型數據庫中,事務機制是非常重要的,假如在多個事務并發操作數據庫時,如果沒有有效的機制進行避免就會導致出現臟讀,不可重復讀,幻讀。
1、在事務A執行過程中,事務A對數據資源進行了修改,事務B讀取了事務A修改后的數據。
2、由于某些原因,事務A并沒有完成提交,發生了RollBack操作,則事務B讀取的數據就是臟數據。
這種讀取到另一個事務未提交的數據的現象就是臟讀(Dirty Read)。
事務B讀取了兩次數據資源,在這兩次讀取的過程中事務A修改了數據,導致事務B在這兩次讀取出來的數據不一致。
這種在同一個事務中,前后兩次讀取的數據不一致的現象就是不可重復讀(Nonrepeatable Read)。
事務B前后兩次讀取同一個范圍的數據,在事務B兩次讀取的過程中事務A新增了數據,導致事務B后一次讀取到前一次查詢沒有看到的行。
幻讀和不可重復讀有些類似,但是幻讀強調的是集合的增減,而不是單條數據的更新。
事務A和事務B都對數據進行更新,但是事務A由于某種原因事務回滾了,把已經提交的事務B的更新數據給覆蓋了。這種現象就是第一類更新丟失。
其實跟第一類更新丟失有點類似,也是兩個事務同時對數據進行更新,但是事務A的更新把已提交的事務B的更新數據給覆蓋了。這種現象就是第二類更新丟失。
為了解決以上的問題,主流的關系型數據庫都會提供四種事務的隔離級別。事務隔離級別從低到高分別是:讀未提交、讀已提交、可重復讀、串行化。事務隔離級別等級越高,越能保證數據的一致性和完整性,但是執行效率也越低。所以在設置數據庫的事務隔離級別時需要做一下權衡,MySQL默認是可重復讀的級別。
讀未提交(Read Uncommitted),是最低的隔離級別,所有的事務都可以看到其他未提交的事務的執行結果。只能防止第一類更新丟失,不能解決臟讀,可重復讀,幻讀,所以很少應用于實際項目。
讀已提交(Read Committed), 在該隔離級別下,一個事務的更新操作結果只有在該事務提交之后,另一個事務才可能讀取到同一筆數據更新后的結果。可以防止臟讀和第一類更新丟失,但是不能解決可重復讀和幻讀的問題。
可重復讀(Repeatable Read),MySQL默認的隔離級別。在該隔離級別下,一個事務多次讀同一個數據,在這個事務還沒結束時,其他事務不能訪問該數據(包括了讀寫),這樣就可以在同一個事務內兩次讀到的數據是一樣的。可以防止臟讀、不可重復讀、第一類更新丟失、第二類更新丟失的問題,不過還是會出現幻讀。
串行化(Serializable),這是最高的隔離級別。它要求事務序列化執行,事務只能一個接著一個地執行,不能并發執行。在這個級別,可以解決上面提到的所有并發問題,但可能導致大量的超時現象和鎖競爭,通常不會用這個隔離級別。
“mysql中臟讀、不可重復讀和幻讀的概念”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。