今天回顧一下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 的資料庫系統,必需要具有這四種特性,否...