mysql存在四個事物級別,最常用的是兩個,提交讀,重複讀。
提交讀,簡單的理解就是在事物當中,可以讀取到其他事物提交的資料。
比如,
1, 在事物a中執行語句 select * from user ;。
2, 在事物b中執行語句更新user表。
3, 在事物a中再次執行 select * from user, 結果資料沒有變化。
4, 提交事物b。
5, 在事物a中繼續執行 select * from user ,此時,結果資料發生變化。
重複讀,也就是保證在mysql的事物中,執行相同的查詢語句,返回相同的結果,即使在之間資料發生修改也仍然如此。
1, 在事物a中執行語句 select * from user ;。
2, 在事物b中執行語句更新user表。
3, 在事物a中再次執行 select * from user, 結果資料沒有變化。
4, 提交事物b。
5, 在事物a中繼續執行 select * from user ,此時,結果資料沒有發生變化。
通過這個流程,可以發現,重複讀之間,b事物已經修改了資料,並切提交,但是對a事物沒有影響。
然而重複讀需要注意乙個地方,那就是讀。也就是資料讀取一直之後,其他事物修改資料並提交事物不會影響資料結果。 然而有一種場景會出現另一種情況,
如下1, 開啟事物a,不執行查詢
2, 在事物b中執行語句更新user表。
3, 提交事物b。
4, 在事物a中繼續執行 select * from user ,此時,結果資料為事物b更新後的資料。
以上情況會導致乙個問題就是在扣除庫存時,可能導致重複資料存在。看看如下場景
1, 在a事物中,檢視 到存在2個可售庫存,並檢視到可售物品a,b。
2,在b事物中,檢視 到存在2個可售庫存,並檢視到可售物品a,b。
3,a事物減少1個庫存,.
4, b事物減少乙個庫存,應為行鎖的關係,阻塞等待a事物提交。
5, a事物檢視到到可售物品,a.b。 講a物品分配給使用者,並提交事物,a事物結束。
6,b事物的阻塞因為a事物提交成功,因此減少庫存成功。
7,b事物檢視可售物品, 因為在步驟2已執行查詢語句,導致檢視到物品a,b都可以**。
8,b事物將a物品分配給使用者,並提交事物。
以上流程執行的結果就是a物品被重複分配。原因就是重複讀導致的幻讀情況,實際上在步驟7中,b事物讀取的資料已經不在是資料庫的實際資料。
解決以上問題的辦法很簡單。1,在事物實際使用之前,不執行相關的查詢語句。此方法侷限太大。
2,在分配資料之時,嚴格判斷資料分配狀態。
MySQL事物級別
原子性 事務要麼成功,要麼中間失敗回滾到操作之前的狀態 一致性 a向b轉錢,不可能b沒收到 隔離性 對於某資料,在乙個時刻只能有乙個事務在操作 永續性 事務完成後,事務對資料庫的所有操作將將被儲存到資料庫,不能回滾 髒讀 事務a讀取事務b更新的資料,然後b回滾操作。不可重複讀 在乙個事務的多次查詢中...
mysql事物級別詳解
sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因...
mysql事物隔離級別
複習鞏固加深印象 一。事務 acid原子性,隔離性,一致性,永續性 二。事務隔離級別 通常併發事務處理 1 寫 寫,存在更新丟失問題 2 讀 寫,有隔離性問題,可能遇到髒讀,不可重複讀,幻讀 其中 1.髒讀 a事務讀到b未提交的資料 2.不可重複讀 a事務第二次讀時讀到了b事務提交的寫資料,可能導致...