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