亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

1. 前言

MySQL 中事務(Transaction)的定義是對于一個或者多個 SQL 語句,要么全部執行成功,要么一個都不執行成功。在實際應用場景中,有很多需要事務的場景,例如在電商網站,顧客下單、付款以及商品扣減庫存就應該在一個事務中執行,如果不能保證事務特性,就可能出現用戶已經下單并且成功付款,但是在扣減庫存邏輯出現異常,發貨失敗的情況。所以事務中的某個環節出現異常,之前執行的所有 SQL 語句都應該回滾。

2. 事務

2.1 事務 ACID 特性

面試官提問: MySQL 中事務的特性是什么?

題目解析:

ACID 是衡量事務的 4 個維度,分別的定義是:

(1)原子性(Atomic,簡寫 A):原子性要求事務是一個不可分割的執行單位,如果一個事務包含多條 SQL 語句,要么所有的 SQL 都執行成功,要么所有的 SQL 都執行失敗,不存在兩者之間的中間狀態。如果事務中的任意一條 SQL 執行失敗,那么已執行成功的也需要回滾。MySQL 中 InnoDB 引擎利用 undo log 實現原子性,undo log 記錄了所有已執行的 SQL 記錄,如果事務執行失敗調用了 rollback 語句,那么使用 undo log 的記錄回滾已執行的 SQL。
(2)持久性(Durability,簡寫 D):持久性要求事務一旦提交(commit),對數據庫的改變就應該是永久的,其他的操作不會對已提交的事務有影響。InnoDB 引擎中使用 redo log 實現持久性,如果 MySQl 服務器宕機,那么在重啟時可以讀取 redo log 中的記錄恢復數據庫。
(3)隔離性(Isolation,簡寫 I):要求一個事務的執行不受到其他并發執行事務的影響。
(4)一致性(Consistency,簡寫 C):事務將數據庫從一種狀態轉換到另一種狀態,但是兩種狀態從數據上是一致的。例如用戶下單扣庫存讓庫存減少了一個單位,那么在訂單中就會增加一個單位的商品,庫存和訂單中的商品數量和是不會改變的。

2.2 事務隔離級別

面試官提問:ACID 特性中的隔離性在 MySQL 中的具體定義是什么?

題目解析:

MySQL 提供了 4 種事務隔離級別,分別是:

(1)讀未提交(Read Uncommitted):所有事務可以看到其他事務未提交的執行結果;
(2)讀已提交(Read Committed):所有事務只能看到其他事務已提交的執行結果;
(3)可重復讀(Repeatable Read):MySQL 默認的隔離級別,所有事務能看到其他事務已提交后的修改后數據,但是如果第一次讀取到這個修改后的數據,如果其他事務繼續修改了數據并且提交,這個事務讀到的也是第一次讀到的值,不會讀到修改后的新值。
(4)串行化(Serializable):最高隔離級別,可以理解為讓所有并發執行的事務都進入隊列,挨個串行執行,永遠不可能發生沖突。

我們關注事務,關注點在于不同事務的并發沖突,而且重點在于讀寫操作。對于同一條數據,在執行并發事務時可能會產生讀寫上的問題,有三種:

(1)臟讀(Dirty Read):如果事務 A 更新了一份數據,比如將記錄 a 更新為記錄 b,那么在事務 B 中讀取到的記錄是 b,此時事務 A 進行了回滾操作,記錄 b 回滾為記錄 a,那么事務 B 讀到的記錄 b 則是非法數據。
(2)不可重復讀(Non-Repeatable Read):如果事務 A 更新了一份數據,比如將記錄 a 更新為記錄 b,那么在事務 B 中讀取到的記錄是 b,此時事務 A 繼續將記錄 b 更新為記錄 c,那么事務 B 第二次讀到的記錄是 c,兩次讀取的結果不同。
(3)幻讀(Phantom Read):如果事務 B 查詢到了幾行數據,此時事務 A 又插入了幾行新數據,那么事務 B 會讀到多出來的幾行數據,讀到了上次讀取沒出現的數據。

4 種隔離級別對應的問題應對能力如下表:

隔離級別 臟讀 不可重復讀 幻讀
讀未提交 ? ? ?
讀已提交 ? ? ?
可重復讀 ? ? ?
串行化 ? ? ?

從解決問題的能力上看,串行化能解決所有的并發讀寫問題,但是串行執行效率太低,比如在電商網站的秒殺商品下單流程,就會導致所有的用戶需要等某一個用戶執行完下單操作后才能繼續搶購,不具有實戰意義。MySQL 默認的隔離級別是可重復讀,這個級別能解決臟讀和不可重復讀的問題,效率上相對比較快。讀未提交的執行效率最高,但是數據的一致性保障最差, 一般不會在實戰中使用。

在 MySQL 客戶端執行 show variables like 'transaction_isolation'; 語句可查看隔離級別:

圖片描述

MySQL 默認隔離級別

3. 小結

本小結概括了事務的 ACID 特性以及 4 種隔離級別的定義,候選人可以自行使用小樣本數據測試 MySQL 不同隔離級別下事務的讀寫區別。