MySQL事務隔離級別

2021-09-26 21:08:57 字數 2600 閱讀 6310

今天回顧一下mysql的事務隔離級別,mysql的事務隔離級別分為以下四種:

read uncommitted : 讀未提交,即髒讀。乙個事務可以讀取到另乙個事務修改並未提交的資料;

read committed : 讀已提交,可以解決髒讀。乙個事務修改並提交之後才能被另乙個事務讀取(不可重複讀);

repeatable read : 可重複讀。在乙個事務的兩次查詢中,被另乙個事務修改了資料,兩次查詢結果一致(出現幻讀);

serializable : 序列化,可以解決髒讀、不可重複讀、幻讀。相當於鎖表。

接下來使用兩個視窗,同乙個使用者,進入到mysql來驗證上面的四種隔離級別。首先建立乙個表,新增兩條測試資料,如下所示:

設定和檢視隔離級別的語句如下:

--設定隔離級別 read uncommitted | read committed | repeatable read | serializable

set session transaction isolation level read uncommitted;

--檢視隔離級別

show variables like '%isolation';

開啟和結束事務的語句如下

--開啟乙個事務,如果不寫則預設自動提交

begin;

--結束乙個事務

commit; | rollback;

總體流程為下圖

可以看到,事務 a 在還沒有提交資料的時候,事務 b 就已經能夠查詢到為提交的資料了。

首先在 a b 視窗設定隔離界別為讀已提交

以同樣的步驟可以看出,在 a 沒有提交時,在b視窗時查詢不到最新的資料的。

開始介紹的時候說過,這種隔離級別會產生不可重複讀的情況,也就是說,當 b 在一次事務中 連續查詢兩次,在這兩次查詢中間,事務a 對資料進行了更改,那麼 在同乙個事務 b 中的兩次查詢結果不一致,若要測試 需在b中也開啟事務,總體如下:

可以看到 在同乙個 b 事務中的兩次查詢之間,由於事務a對資料進行修改並提交,導致兩次查詢的結果不一致。危害自行領悟。

把 a b 兩個視窗的事務隔離級別都設定為 repeatable read 。然後進行測試。

由上圖測試可知,隔離級別設定為 可重複讀之後。即使在b事務的兩次查詢之間 a 事務對資料行進修改並提交,b 事務第二次查詢的資料和第一次仍然相同。結束本次事務之後,再次查詢,方為最新值。

但此種隔離級別會出現幻讀的情況,什麼是幻讀呢,這個不太好解釋,直接用測試說明,如下圖:

這個測試步驟即過程如下:

b 視窗 開啟了乙個事務,並查詢 是否有 id 為3 的資料,查詢為空,準備新增一條 id為3 的資料。

此時 a 視窗開啟了乙個事務,新增了一條id為3的資料,並且提交了。

此時,事務 b 開始新增 id 為3的資料,發現表中已經有了一條 id 為3的資料,從而無法新增。

由於 repeatable read 支援可重複讀,所以當事務 b 再次查詢 id 為3的資料的時候,返現還是沒有(乙個事務中)。

對於事務 b 來說,明天查不到資料,但當新增資料時,卻被提示 id 為3的資料已存在,這就是幻讀。相信通過這個例子要比講一些原理更容易理解和記憶。當然如果想要解決這個問題,可以手動加鎖的方式,即在事務 b 首次查詢的時候,在查詢語句後加上 for update  即可實現加鎖的效果,**如下:

select * from user for update;
序列化可以解決幻讀的問題,當然了,前面的問題對於它也就不是問題了,直接通過測試說明:

測試說明:

首先在b視窗開啟 事務b;

然後在 a 視窗開啟事務a;

事務 b 查詢 id 為5的資料,發現返回結果為空,準備新增第五條資料;

此時,事務 a 想使壞,想提前新增一條 id 為5的資料,發現一致處於阻塞狀態,無法新增;

然後事務 b 就有了時間,新增 id 為5的資料,並成功提交;

事務 b 剛剛提交,事務 a 中剛剛被阻塞的語句就立馬報了乙個錯,被告知主鍵已存在。

由此可知,在序列化的隔離級別下,innodb 會自動加鎖,以保證我們資料的安全。mysql的四種事務隔離級別就到這裡。

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...

MySQL事務隔離級別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...

Mysql 事務隔離級別

mysql 5.5預設儲存引擎 表型別 使用的是innodb,它是支援acid特性的 acid,指資料庫的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否...