數據庫之事務級別

沒有事務會發生的情況:
1.髒讀
    髒讀就是指當事務A對數據進行了修改,而這種修改還沒有提交到數據庫中,
    這時,另外一個事務B也訪問這個數據,然後使用了這個數據,
    此時事務A進行回滾操作那這條數據就會有問題。
    這就是髒讀。
2.不可重複讀
    不可重複讀是指在事務A內,讀取了一個數據,事務A還沒有結束時,
    這是事務B也訪問了這個數據,修改了這個數據,並提交。
    緊接着,事務A又讀這個數據。由於事務B的修改,那麼事務A兩次讀到的的數據可能是不一樣的,因此稱爲是不可重複讀。
    (經典案例,先檢查餘額後扣款)
3.幻讀
    所謂幻讀,指的是當事務A在讀取某個範圍內的記錄時,
    此時事務B又在該範圍內插入了新的記錄,
    當之前的事務A再次讀取該範圍的記錄時,會產生幻行。
    這就是幻讀。
    
幻讀和不可重複讀的區別就是:不可重複讀是讀到了其他事務修改的數據(行級鎖解決),幻讀是讀到了其他事務新增的數據(表級鎖解決)
    
事務隔離級別以及處理的問題
1.讀未提交
    可以讀到其他事務未提交的數據,什麼情況都處理不了。
    
2.讀提交
    只能讀到其他事務已經提交的事務(使用快照讀解決,讀快照版本),能避免髒讀,但是無法避免不可重複讀和幻讀(oracle默認事務級別)

3.可重複讀
    爲了處理不可重複讀而存在,實質上也是快照讀,但是在事務開啓的時候不允許其他事務對數據進行修改(update操作)(mysql的Innodb默認事務級別),
    能避免髒讀和不可重複讀,但是不能避免幻讀
    
4.串行化
    面面俱到,事務“串行化順序執行”,也就是一個一個排隊執行。
    能避免上述所有情況,但是效率較差,除特殊情況外一般使用可重複讀事務級別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章