【面試必備】3分鐘掌握MySQL事務隔離級別知識點!

近期,不少開發的朋友們總問我,面試時總被問到MySQL事務隔離級別基礎問題,答不上來咋辦,今天特意將之前寫的一篇文章發出來,希望大家能有所收穫!

一、什麼是事務

  1. 概念:事務是包含了一組有序的數據庫操作命令的序列,它是數據庫併發操作的最小控制單位。
  2. 特性
  • 原子性:事務包含的數據庫操作命令要麼都執行,要麼都不執行。
  • 一致性:當事務完成時,數據庫處於穩定而一致的狀態。即事務執行後,數據庫數據要符合規定,而且所有數據查詢的結果是一致的。
  • 隔離性:多個事務同時執行時,他們之間是互不干擾的。
  • 永久性:一旦事務提交成功,它引發的變化也就永久保存了下來,硬件與應用程序發生錯誤也不能改變。

二、在併發執行事務時會發生什麼問題呢?

  1. 髒讀:一個事務讀到另一個事務未提交的更新數據。
  2. 不可重複讀:一個事務讀到另一個事務已提交的更新數據。
  3. 幻讀:一個事務讀到另一個事務已提交的新插入的數據。

三、四種隔離級別

1. Read Uncommitted(讀未提交數據):一個事務在執行過程中可以看到其他事務沒有提交的新插入的記錄,而且能看到其他事務沒有提交的對已有記錄的更新。

2. Read Commited(讀已提交數據):一個事務在執行過程中可以看到其他事務已經提交的新插入的記錄,而且能看到其他事務已經提交的對已有記錄的更新。

3. Repeatable Read(可重複讀):一個事務在執行過程中可以看到其他事務已經提交的新插入的記錄,但是不能看到其他其他事務對已有記錄的更新。

4. Serializable(串行化):事務執行的時候不允許別的事務併發執行。

四、通過例子理解事務的4種隔離級別

首先,我們使用test數據庫,新建test表,如下:

【面試必備】3分鐘掌握MySQL事務隔離級別知識點!

接著開啟兩個客戶端。

第1級別:Read Uncommitted(讀取未提交內容)

所有事務都可以看到其他未提交事務的執行結果,該級別會引發髒讀。

例子:

【面試必備】3分鐘掌握MySQL事務隔離級別知識點!

【面試必備】3分鐘掌握MySQL事務隔離級別知識點!

【面試必備】3分鐘掌握MySQL事務隔離級別知識點!

髒讀意味著在這個事務中(A中),事務B雖然沒有提交,但它任何一條數據變化,事務A都可以看到!

第2級別:Read Committed(讀取提交內容)

這個級別是大多數數據庫系統的默認隔離級別,但MySQL不是;在這個級別,一個事務只能看見已經提交事務所做的改變;這種隔離級別出現的問題是——不可重複讀(Nonrepeatable Read)。

例子:

【面試必備】3分鐘掌握MySQL事務隔離級別知識點!

【面試必備】3分鐘掌握MySQL事務隔離級別知識點!

【面試必備】3分鐘掌握MySQL事務隔離級別知識點!

第3級別:Repeatable Read(可重讀)

這是MySQL的默認事務隔離級別,它確保同一事務的多個實例在併發讀取數據時,會看到同樣的數據行;此級別可能出現的問題——幻讀(Phantom Read):當用戶讀取某一範圍的數據行時,另一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的數據行時,會發現有新的“幻影” 行;InnoDB和Falcon存儲引擎通過多版本併發控制(MVCC)機制解決了該問題。

例子:

【面試必備】3分鐘掌握MySQL事務隔離級別知識點!

【面試必備】3分鐘掌握MySQL事務隔離級別知識點!

【面試必備】3分鐘掌握MySQL事務隔離級別知識點!

第4級別:Serializable(可串行化)

這是最高的隔離級別,它在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭,不推薦在實際應用場景中使用。

例子:

【面試必備】3分鐘掌握MySQL事務隔離級別知識點!

後記:

今天數據庫事務隔離級別的介紹就到這裡,如果想要更深入的瞭解MVCC機制或者其他MySQL知識,歡迎點擊上方關注按鈕,後續內容更精彩!


分享到:


相關文章: