MySQL事務隔離級別
事務
事務是由單獨的一個或者多個SQL陳述句組成,是一個最小的不可再分割的單元,這一組操作里面的所有的執行,要么全部成功、要么全部不成功,如果有一個執行不成功,則全部進行回滾,
例如: 去銀行轉賬,用戶用A賬戶轉100元到B賬戶,首先A賬戶需要扣減100元,B賬戶需要增加100元,這兩個操作必須都要全部成功完成,如果有其中一個操作出現失敗,例如A賬戶扣減完100,B賬戶增加100元時出現錯誤,則A賬戶增加的100也要回滾,否則就會導致金額不對,事務就是保證這兩個操作要么都成功,要么都不成功,
事務的并發問題
臟讀

事務A讀取到了事務B已經修改還未提交的資料,此時如果事務B回滾,則事務A讀取到的資料就是無效的,這種資料就是"臟資料",事務A根據這個資料進行操作可能就會出現錯誤,
不可重復讀

事務A讀取某一個欄位時,事務B對該欄位進行了修改,事務A再次讀取該欄位時,讀取到的值和第一次讀取到的值不一致,
幻讀

事務A查詢表中資料,事務B新增了資料到該表中,事務A再次查詢表中資料,兩次查詢結果不一致,
不可重復讀和幻讀的區別:不可重復讀針對的是修改,幻讀針對的是新增或洗掉,
不可重復讀指的是兩次讀取過來的資料內容不一樣,幻讀指的是兩次讀取過來的資料條數不一樣,
串行化
事務A和事務B同時操作資料時,如果事務A修改了資料,沒有提交資料時,事務B想增加、修改、洗掉資料,都必須等待事務A提交,事務B才能執行,
事務的隔離級別
讀取未提交(Read Uncommitted)
允許事務讀取到其他事務未提交的資料,事務A可以讀取到事務B修改但是未提交的資料,隔離級別最低,上面出現的并發問題都沒解決,
讀取已提交(Read Committed)(Oracle默認)
事務只能看到其他事務已經提交的資料,事務A只能讀取事務B已經提交的資料,可以避免臟讀,但是不可以避免不可重復讀和幻讀,
可重復讀(Repeatable Read)(MySQL默認)
事務多次讀取時可以保證讀取到相同的值,在事務期間,禁止其他事務對該資料進行更新操作,事務A讀取某商品數量100,在此期間禁止事務B更新該商品數量,事務A再次讀取該商品數量還是100.可以避免臟讀和不可重復讀,但是無法避免幻讀,
可串行化(Serializable)
保證事務讀取到相同的資料,在事務期間,禁止其他事務對該表進行新增、更新、洗掉操作,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/508868.html
標籤:其他
