近期,不少開發的朋友們總問我,面試時總被問到MySQL事務隔離級別基礎問題,答不上來咋辦,今天特意將之前寫的一篇文章發出來,希望大家能有所收穫!
一、什麼是事務
- 概念:事務是包含了一組有序的數據庫操作命令的序列,它是數據庫併發操作的最小控制單位。
- 特性:
- 原子性:事務包含的數據庫操作命令要麼都執行,要麼都不執行。
- 一致性:當事務完成時,數據庫處於穩定而一致的狀態。即事務執行後,數據庫數據要符合規定,而且所有數據查詢的結果是一致的。
- 隔離性:多個事務同時執行時,他們之間是互不干擾的。
- 永久性:一旦事務提交成功,它引發的變化也就永久保存了下來,硬件與應用程序發生錯誤也不能改變。
二、在併發執行事務時會發生什麼問題呢?
- 髒讀:一個事務讀到另一個事務未提交的更新數據。
- 不可重複讀:一個事務讀到另一個事務已提交的更新數據。
- 幻讀:一個事務讀到另一個事務已提交的新插入的數據。
三、四種隔離級別
1. Read Uncommitted(讀未提交數據):一個事務在執行過程中可以看到其他事務沒有提交的新插入的記錄,而且能看到其他事務沒有提交的對已有記錄的更新。
2. Read Commited(讀已提交數據):一個事務在執行過程中可以看到其他事務已經提交的新插入的記錄,而且能看到其他事務已經提交的對已有記錄的更新。
3. Repeatable Read(可重複讀):一個事務在執行過程中可以看到其他事務已經提交的新插入的記錄,但是不能看到其他其他事務對已有記錄的更新。
4. Serializable(串行化):事務執行的時候不允許別的事務併發執行。
四、通過例子理解事務的4種隔離級別
首先,我們使用test數據庫,新建test表,如下:
接著開啟兩個客戶端。
第1級別:Read Uncommitted(讀取未提交內容)
所有事務都可以看到其他未提交事務的執行結果,該級別會引發髒讀。
例子:
髒讀意味著在這個事務中(A中),事務B雖然沒有提交,但它任何一條數據變化,事務A都可以看到!
第2級別:Read Committed(讀取提交內容)
這個級別是大多數數據庫系統的默認隔離級別,但MySQL不是;在這個級別,一個事務只能看見已經提交事務所做的改變;這種隔離級別出現的問題是——不可重複讀(Nonrepeatable Read)。
例子:
第3級別:Repeatable Read(可重讀)
這是MySQL的默認事務隔離級別,它確保同一事務的多個實例在併發讀取數據時,會看到同樣的數據行;此級別可能出現的問題——幻讀(Phantom Read):當用戶讀取某一範圍的數據行時,另一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的數據行時,會發現有新的“幻影” 行;InnoDB和Falcon存儲引擎通過多版本併發控制(MVCC)機制解決了該問題。
例子:
第4級別:Serializable(可串行化)
這是最高的隔離級別,它在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭,不推薦在實際應用場景中使用。
例子:
後記: 今天數據庫事務隔離級別的介紹就到這裡,如果想要更深入的瞭解MVCC機制或者其他MySQL知識,歡迎點擊上方關注按鈕,後續內容更精彩!
閱讀更多 架構之美 的文章