天天看點

淺析MySQL事務隔離級别對其性能的影響

淺析MySQL事務隔離級别對其性能的影響

       MySQL對事務的隔離級别共分為四個級别,分别是:

1.        READ UNCOMMITTED     讀未送出

2.        READ COMMITTED       讀送出

3.        REPEATABLE           可重讀

4.        SERIALIABLE          可串讀

MySQL預設工作在級别三下。我們知道事務隔離是為了避免并發操作互相影響而導資料的不一緻性。是以為了保證資料的一緻性,就引入了事務隔離的功能。以上四個級别的對資料的一緻性保護是逐漸提高的。級别4對事務的隔離效果最好,但是性能最差,一般不再生産環境中使用。

下面通過執行個體來檢驗不同級别下MySQL性能收到的影響。我的實驗環境是:Redhat5.8+MySQL5.5

首先我們這裡啟用兩個session:

1、驗證級别一的特性

我們在session A上進行的操作為:

淺析MySQL事務隔離級别對其性能的影響

在session B上的操作同session A,這裡不再附上截圖。

       接下來我們就通過一系列的實驗來觀察READ-UNCOMMITTED到底是什麼,它到底有什麼特性,對我們的操作到底有什麼影響。首先,我們可以看到表中的初始資料如下:

淺析MySQL事務隔離級别對其性能的影響

接下來我們在sessionA上更改其中的一條記錄,更改結果如下:

淺析MySQL事務隔離級别對其性能的影響

注意:我們在上面啟用了事務,但是我們在這裡并沒有進行commit操作。

接下來我們在sessionB中對剛才改過的表進行select查詢,查詢結果如下:

淺析MySQL事務隔離級别對其性能的影響

我們可以清楚的看到,雖然我們并沒有對session A的結果進行commit,但是結果确實已經改變。是以在這種級别下,沒有送出的操作會對資料的一緻性有影響。是以,如果我們此時在session A上對上述操作進行復原,我們會發現此時session B上的結果又回到原來最初的結果,這樣就造成了資料的不一緻性,這也稱為資料的幻讀現象,看起來是很詭異的事情。是以在某些場景下,我們應該避免這種現象的産生。但是這種級别也不是沒有它的用武之地,比如當我們有大量資料需要寫入,而讀操作很少的時候,就适合用這種模式。

可以看到session A復原後,session B中的資料又變成最初的樣子,這也稱為幻讀:

淺析MySQL事務隔離級别對其性能的影響

2、驗證級别READ COMMITTED特性

       首先把session A和session B的隔離級别都改為READ-COMMITTED,并且全部都開啟事務,操作如下:

淺析MySQL事務隔離級别對其性能的影響

接下來我們檢視tutors表的初始狀态資訊:

淺析MySQL事務隔離級别對其性能的影響

然後我們依然是對資料進行更新操作,更新之後仍然沒有commit。我們可以看到在sessionA中,結果已經發生改變:

淺析MySQL事務隔離級别對其性能的影響

此時我們在session B中檢視,發現結果依然維持不變:

淺析MySQL事務隔離級别對其性能的影響

但是,如果我們此時在session A中進行commit操作,我們就會發現,sessionB此時查詢就會發生改變,這樣也造成了資料的前後不一緻性,也是資料的幻讀:

淺析MySQL事務隔離級别對其性能的影響

3、資料的可重讀

       資料的可重讀,也叫作REPEATABLE-READ,這是MySQL預設采用的事務隔離級别,有其優勢,但是仍然沒有從根本上解決資料的一緻性問題。首先,還是讓我們來測試一下,在這種級别下MySQL到底是如何工作的,又有哪些特性,我們又該怎樣去操作。

       我們先把REPEATABLE-READ的環境設定好,具體的操作方法如下:

淺析MySQL事務隔離級别對其性能的影響

然後我們在檢視其初始資料,其結果如下:

淺析MySQL事務隔離級别對其性能的影響

我們在session A中修改資料,并進行commit,修改後的結果如下:

淺析MySQL事務隔離級别對其性能的影響

然後我們在session B中進行檢視發現結果仍然沒有任何改變:

淺析MySQL事務隔離級别對其性能的影響

這就是可重讀的特性,隻要本次會話不送出,盡管對方修改,但是結果仍然不變,隻有在session B中也進行commit操作,所作的修改才會在sessionB中生效。

4、seriabliable

這個級别是事務隔離安全性最好的,但是也是性能最差的,因為這個級别所有的操作都是串行進行的。一個操作沒有送出,另一個受到影響的操作會處于阻塞狀态。

為了驗證這種效果,我們先把環境設定好,具體為在session A和session B同時設定如下:

淺析MySQL事務隔離級别對其性能的影響

在session A 中對其任意字段進行修改,并且沒有進行commit操作。此時揮發現sessionB中的查詢操作會一直處于阻塞狀态:

淺析MySQL事務隔離級别對其性能的影響
下一篇: java 實驗1