五分鐘搞清楚MySQL事務隔離級別

好久沒碰數據庫了,只是想起自己當時在搞數據庫的時候在事務隔離級別這塊老是卡,似懂非懂的?,F在想把這塊整理出來,盡量用最簡潔的語言描述出來,供新人參考。

首先創建一個表account。創建表的過程略過(由于InnoDB存儲引擎支持事務,所以將表的存儲引擎設置為InnoDB)。表的結構如下:

表結構

然后往表中插入兩條數據,插入后結果如下:

數據

為了說明問題,我們打開兩個控制臺分別進行登錄來模擬兩個用戶(暫且成為用戶A和用戶B吧),并設置當前MySQL會話的事務隔離級別。

一. read uncommitted(讀取未提交數據)

具體用戶A的操作如下:

set session transaction isolation level read uncommitted;
start transaction;
select * from account;

結果如下:

數據

用戶B的操作如下:

set session transaction isolation level read uncommitted;
start transaction;
update account set account=account+200 where id = 1;

隨后我們在A用戶中查詢數據,結果如下:

uncommittedA數據

結論一:

我們將事務隔離級別設置為read uncommitted,即便是事務沒有commit,但是我們仍然能讀到未提交的數據,這是所有隔離級別中最低的一種。

那么這么做有什么問題嗎?

那就是我們在一個事務中可以隨隨便便讀取到其他事務未提交的數據,這還是比較麻煩的,我們叫臟讀。我不知道這個名字是怎么起的,為了增強大家的印象,可以這么想,這個事務好輕浮啊,饑渴到連別人沒提交的東西都等不及,真臟,呸!

實際上我們的數據改變了嗎?

答案是否定的,因為只有事務commit后才會更新到數據庫。

二. read committed(可以讀取其他事務提交的數據)---大多數數據庫默認的隔離級別

同樣的辦法,我們將用戶B所在的會話當前事務隔離級別設置為read commited。

在用戶A所在的會話中我們執行下面操作:

update account set account=account-200 where id=1;
read committed

我們將id=1的用戶account減200。然后查詢,發現id=1的用戶account變為800。

在B用戶所在的會話中查詢:

select * from account;

結果如下:

read committedB

我們會發現數據并沒有變,還是1000。

接著在會話A中我們將事務提交:

commit;

在會話B中查詢結果如下:

read committedB1

結論二:

當我們將當前會話的隔離級別設置為read committed的時候,當前會話只能讀取到其他事務提交的數據,未提交的數據讀不到。

那么這么做有什么問題嗎?

那就是我們在會話B同一個事務中,讀取到兩次不同的結果。這就造成了不可重復讀,就是兩次讀取的結果不同。這種現象叫不可重復讀。

三. repeatable read(可重讀)---MySQL默認的隔離級別

現在有個需求,就是老板說在同一個事務中查詢結果必須保持一致,如果你是數據庫,你會怎么做?數據庫是這么做的。

在會話B中我們當前事務隔離級別為repeatable read。具體操作如下:

set session transaction isolation level repeatable read;
start transaction;

接著在會話B中查詢數據:

repeatablereadB1

我們在A用戶所在會話中為表account添加一條數據:

insert into account(id,account) value(3,1000);
commit;

然后我們查詢看數據插入是否成功:

repeatable readA

回到B用戶所在的會話,我們查詢結果:

repeatablereadB2

用戶B在他所在的會話中想插入一條新數據id=3,value=1000。來我們操作下:

readpeatablereadB3

什么?竟然插不進去,說我數據重復?

用戶B當然不服啊,因為查詢到數據只有兩條啊,為什么插入id=3說我數據重復了呢?

我再看一遍,莫非我眼花了?

repeatablereadB2

試想一下,在實際中用戶A和用戶B肯定是相互隔離的,彼此不知道操作什么。用戶B碰到這種現象,肯定會炸毛的啊,明明不存在的數據,插入卻說主鍵id=3數據重復了。

結論三:

當我們將當前會話的隔離級別設置為repeatable read的時候,當前會話可以重復讀,就是每次讀取的結果集都相同,而不管其他事務有沒有提交。

有什么問題嗎?

管他呢,老板的要求滿足了。要一個事務中讀取的數據一致(可重復讀)。我只能這么做啊,打腫臉裝胖子。數據已經發生改變,但是我還是要保持一致。但是,出現了用戶B面對的問題,這種現象叫幻讀(記得當時就在這個地方糾結好久,到底什么是幻讀?。?/p>

四. serializable(串行化)

同樣,我們將用戶B所在的會話的事務隔離級別設置為serializable并開啟事務。

set session transaction isolation level serializable;
start transaction;

在用戶B所在的會話中我們執行下面操作:

select * from account;

結果如下:

serializableA

那我們這個時候在用戶A所在的會話中寫數據呢?


readcommittedA1

我們發現用戶A所在的會話陷入等待,如果超時(這個時間可以進行配置),會出現Lock wait time out提示:

readcommittedA2

如果在等待期間我們用戶B所在的會話事務提交,那么用戶A所在的事務的寫操作將提示操作成功。

結論四:

當我們將當前會話的隔離級別設置為serializable的時候,其他會話對該表的寫操作將被掛起。可以看到,這是隔離級別中最嚴格的,但是這樣做勢必對性能造成影響。所以在實際的選用上,我們要根據當前具體的情況選用合適的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容