mysql隔離級別產生的髒讀,不可重複讀,幻讀問題

2021-10-10 08:05:16 字數 2042 閱讀 1005

read uncommitted  讀未提交

read committed 讀以提交

repeatable read  可重複讀

serializable 序列化

髒讀:乙個事務處理過程裡讀取了另乙個未提交的事務中的資料。

不可重複讀:乙個事務內讀取表中的某一行資料,多次讀取結果不同。

幻讀:指在乙個事務內讀取到了別的事務插入的資料,導致前後讀取不一致

隔離級別

髒讀不可重複讀

幻讀讀未提交√√

√讀已提交×√

√可重複讀××

√序列化××

×查詢隔離級別的

select @@global.tx_isolation;

set global transaction isolation level read committed;

在讀未提交 隔離級別下,乙個事務會讀到其他事務未提交的資料的,即存在髒讀問題。第二個事務都還沒commit到資料庫呢,第乙個事務就讀到了。

將隔離級別從讀未提交設定為讀已提交級別

圖一:為事務a

圖二:為事務b

當事務b沒有commit的時候,事務a前兩次查都是正確的金額1000,當事務b進行了commit後,事務a查詢的金額就是事務b修改後的金額,解決了髒讀的問題。

讀已提交產生新的問題:

事務a在讀取金額為1000,當事務b修改了金額並且提交了事務修改,那麼資料庫現在金額變為1200,而事務a在次讀取時金額為1200,那麼事務a第一次讀和第二次讀的金額資料不一致,這個問題就是不可重複讀的問題。

將隔離級別從讀已提交設定為可重複讀。

圖一:事務a

圖二:事務b

在事務b提交了修改sql後,事務a在自己的事務中沒有提交,兩次讀取都是相同的結果,解決了不可重複讀的問題。

可重複讀產生新的問題幻讀:

當我事務a沒有提交事務。事務b修改了而且也提交了,事務a沒有提交事務的情況下,讀取的資料都是1000,解決了不可重複讀的問題。

但是現在事務b插入一條資料,並且提交了事務。現在事務a提交事務了,然後事務a在查詢所有的資料時,發現多了一條資料,這就產生了幻讀問題

將隔離界別從可重複讀設定為序列化

圖一和圖三:事務a

圖二和圖四:事務b

事務a開啟事務,執行查詢所有資料的sql,但是不提交事務。事務b開始事務,新增一條資料,但是這個時候新增不進去,被阻塞了。

當事務a提交事務後,事務b就可以新增成功。

因為隔離級別是序列化,當乙個事務未執行完,其他事務必須等待第乙個事務提交後才能進行事務操作,解決了幻讀,不可重複讀,髒讀問題。

mysql 隔離級別 髒讀 測試

修改方 查詢方 session a b autocommit off not care 修改方是為了開啟事務 isolation not care read uncommited為邊界 執行順序 左側開啟一次會話 左側第一次insert 右側第一次select 自動提交會話 顯示讀到髒讀 左側rol...

MYSQL事件隔離級別以及復讀,幻讀,髒讀的理解

另乙個事務修改了資料,但尚未提交,而本事務中的select會讀到這些未被提交的資料 髒讀 隔離級別最低,併發效能高 本事務讀取到的是最新的資料 其他事務提交後的 問題是,在同乙個事務裡,前後兩次相同的select會讀到不同的結果 不重複讀 會出現不可重複讀 幻讀問題 鎖定正在讀取的行 在同乙個事務裡...

事務隔離級別 髒讀 spring 測試

建立乙個controller,寫兩個url,用於測試髒讀 一 testcontroller autowired private testservice testservice responsebody apiimplicitparams apioperation value listfordirty...