mysql事物級別的問題。

2021-07-11 21:46:03 字數 1312 閱讀 8245

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事務提交的寫資料,可能導致...