天天看點

MySql 你知道事務隔離是怎麼回事嗎?

在碼農的世界裡,優美的應用體驗,來源于程式員對細節的處理以及自我要求的境界,年輕人也是忙忙碌碌的碼農中一員,每天、每周,都會留下一些腳印,就是這些創作的内容,有一種執着,就是不知為什麼,如果你迷茫,不妨來瞅瞅碼農的軌迹。

​​優美的音樂節奏帶你浏覽這個效果的編碼過程​​

​​堅持每一天,是每個有理想青年的追求​​

​​追尋年輕人的腳步,也許你的答案就在這裡​​

​​如果你迷茫 不妨來瞅瞅這裡​​

事務就是要保證一組資料庫操作,要麼全部成功,要麼全部失敗。

在 MySQL 中,事務支援是在引擎層實作的,MySQL 原生的 MyISAM 引擎就不支援事務,是以就有了 InnoDB 引擎。

當資料庫上有多個事務同時執行的時候,就可能出現髒讀(dirty read)、不可重複讀 (non-repeatable read)、幻讀(phantom read)的問題,為了解決這些問題,就有 了“隔離級别”的概念。

髒讀指的是讀到了其他事務未送出的資料,未送出意味着這些資料可能會復原,也就是可能最終不會存到資料庫中,也就是不存在的資料。讀到了并一定最終存在的資料,這就是髒讀。

不可重複讀指的是在同一事務内,不同的時刻讀到的同一批資料可能是不一樣的,可能會受到其他事務的影響,比如其他事務改了這批資料并送出了

假設事務A對某些行的内容作了更改,但是還未送出,此時事務B插入了與事務A更改前的記錄相同的記錄行,并且在事務A送出之前先送出了,而這時,在事務A中查詢,會發現好像剛剛的更改對于某些資料未起作用,但其實是事務B剛插入進來的,讓使用者感覺很魔幻,感覺出現了幻覺,這就叫幻讀

為了解決這些問題,就有 了“隔離級别”的概念

隔離就是将事務操作隔離,互相之間不影響,隔離得越嚴實,效率就會越低,是以在業務開發中,需要在二者之間尋找一個平衡點,

SQL 标準的事務隔離級别包括:

讀未送出(read uncommitted)

讀送出(read committed)

可重複讀(repeatable read)

串行化 (serializable )。

MySQL 的 InnoDB 引擎支援事務,其中可重複讀是預設的隔離級别。

如這裡我們有一張表

然後這裡有一條使用者資料

MySql 你知道事務隔離是怎麼回事嗎?

現在我們來修改這個使用者的年齡來說明一下不同的事務隔離(修改使用者的年齡為22)。

如下圖所示,若隔離級别是“讀未送出”, 則 V1 的值就是 22。這時候事務 B 雖然還沒有送出,但是 結果已經被 A 看到了。是以,V2、V3 也都是 22。

MySql 你知道事務隔離是怎麼回事嗎?

若隔離級别是“讀送出”,則 V1 是 20,事務 B 的更新在送出後才能被 A 看到。是以,V2 、V3 的值是 22。

MySql 你知道事務隔離是怎麼回事嗎?

若隔離級别是“可重複讀”,則 V1、V2 是 20,V3 是 22。之是以 V2 還是 20,遵循的就是這個要求:事務在執行期間看到的資料前後必須是一緻的。

若隔離級别是“串行化”,則在事務 B 執行“将 20 改成 22”的時候,會被鎖住。直到事務 A 送出後,事務 B 才可以繼續執行。是以從 A 的角度看, V1、V2 值是 20,V3 的值 是 22。

MySql 你知道事務隔離是怎麼回事嗎?

在 MySQL 中,實際上每條記錄在更新的時候都會同時記錄一條復原操作,記錄上的最新值,通過復原操作,都可以得到前一個狀态的值。

如在可重複讀隔離模式下,假設将一個值從 1 被按順序改成了 2、3、4,在復原日志裡面就會有類似下面的記錄。

MySql 你知道事務隔離是怎麼回事嗎?

完畢

不局限于思維,不局限語言限制,才是程式設計的最高境界。

以小編的性格,肯定是要錄制一套視訊的,随後會上傳

有興趣 你可以關注一下 ​​西瓜視訊 — 早起的年輕人​​

MySql 你知道事務隔離是怎麼回事嗎?