
.
MySQL 的事務(wù)隔離級別是數(shù)據(jù)庫并發(fā)控制的核心機制,用于解決多個事務(wù)同時操作數(shù)據(jù)時可能出現(xiàn)的 臟讀、不可重復(fù)讀 和 幻讀 等問題。數(shù)據(jù)庫標準定義了 4 種隔離級別,MySQL InnoDB 存儲引擎全部支持,具體如下(按隔離程度從低到高排序):
-
定義:一個事務(wù)可以讀取另一個未提交事務(wù)修改的數(shù)據(jù)。
-
問題:存在 臟讀(讀取到未提交的無效數(shù)據(jù))、不可重復(fù)讀和幻讀。
-
適用場景:幾乎不使用,僅在對數(shù)據(jù)一致性要求極低且追求極致性能時考慮。
-
定義:一個事務(wù)只能讀取另一個已提交事務(wù)的數(shù)據(jù),避免臟讀。
-
解決問題:防止臟讀。
-
存在問題:可能出現(xiàn) 不可重復(fù)讀(同一事務(wù)內(nèi)兩次讀取同一數(shù)據(jù),結(jié)果因其他事務(wù)提交而不同)和幻讀。
-
適用場景:多數(shù)互聯(lián)網(wǎng)業(yè)務(wù)(如電商訂單、支付場景),是 Oracle、SQL Server 等數(shù)據(jù)庫的默認隔離級別。
-
定義:保證同一事務(wù)內(nèi)多次讀取同一數(shù)據(jù)的結(jié)果一致,不受其他事務(wù)提交的影響。
-
解決問題:防止臟讀和不可重復(fù)讀。
-
特殊說明:
MySQL InnoDB 通過 MVCC(多版本并發(fā)控制) 機制實現(xiàn)可重復(fù)讀,且通過 間隙鎖(Gap Lock) 解決了標準隔離級別中可能存在的 幻讀 問題(這是 MySQL 的特有優(yōu)化)。
-
適用場景:大多數(shù)業(yè)務(wù)場景,在一致性和并發(fā)性能間取得較好平衡。
-
定義:最高隔離級別,強制事務(wù)串行執(zhí)行(類似單線程),完全避免并發(fā)沖突。
-
解決問題:防止臟讀、不可重復(fù)讀和幻讀。
-
問題:并發(fā)性能極差,可能導(dǎo)致大量事務(wù)超時。
-
適用場景:對數(shù)據(jù)一致性要求極高且并發(fā)量極低的場景(如金融核心交易的特定步驟)。
SELECT @@global.transaction_isolation;
SELECT @@transaction_isolation;
SET GLOBAL transaction_isolation = 'READ-COMMITTED';
SET SESSION transaction_isolation = 'SERIALIZABLE';
設(shè)置時需使用以下字符串值:
'READ-UNCOMMITTED'、'READ-COMMITTED'、'REPEATABLE-READ'、'SERIALIZABLE'
隔離級別越高,數(shù)據(jù)一致性越好,但并發(fā)性能越差。實際應(yīng)用中,需根據(jù)業(yè)務(wù)對一致性和性能的需求選擇:
-
多數(shù)場景:使用 MySQL 默認的 REPEATABLE READ
-
需兼容其他數(shù)據(jù)庫(如 Oracle):可改為 READ COMMITTED
-
極端一致性要求:使用 SERIALIZABLE(謹慎使用)