MySQL 的預設隔離級別是 REPEATABLE READ。
隔離級別概述
資料庫的隔離級別決定了事務相互隔離的程度,從而影響到併發事務的行為。SQL 標準定義了四種隔離級別:
- READ UNCOMMITTED(未提交讀)
- READ COMMITTED(提交讀)
- REPEATABLE READ(可重複讀)
- SERIALIZABLE(可序列化)
每種隔離級別解決不同型別的併發問題,包括髒讀、不可重複讀和幻讀。以下是對每種隔離級別的簡要描述:
- READ UNCOMMITTED: 允許事務讀取未提交的資料(可能導致髒讀)。
- READ COMMITTED: 只允許事務讀取已提交的資料(防止髒讀,但可能出現不可重複讀)。
- REPEATABLE READ: 保證在同一個事務內多次讀取相同資料結果一致(防止髒讀和不可重複讀,但可能出現幻讀)。
- SERIALIZABLE: 最嚴格的隔離級別,透過強制事務序列執行來防止所有併發問題(防止髒讀、不可重複讀和幻讀)。
MySQL 的預設隔離級別
MySQL 的預設隔離級別是 REPEATABLE READ。這種隔離級別在大多數情況下提供了一個良好的平衡,既能保證資料一致性,又能提供較好的併發效能。
如何檢視和設定隔離級別
您可以透過以下方式檢視當前會話和全域性的隔離級別:
檢視當前會話隔離級別
SELECT @@tx_isolation;
或者在 MySQL 8.0 及更高版本中:
SELECT @@transaction_isolation;
檢視全域性隔離級別
SELECT @@global.tx_isolation;
或者在 MySQL 8.0 及更高版本中:
SELECT @@global.transaction_isolation;
設定當前會話隔離級別
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
設定全域性隔離級別
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
示例
檢視當前會話的隔離級別
SELECT @@tx_isolation;
-- 或者
SELECT @@transaction_isolation;
將當前會話的隔離級別設定為 READ COMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
將全域性隔離級別設定為 READ COMMITTED
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
注意:改變全域性隔離級別只會影響在更改後新建立的會話,已經存在的會話不會受到影響。
結論
MySQL 的預設事務隔離級別是 REPEATABLE READ,這種隔離級別在大多數情況下提供了良好的資料一致性和併發效能。根據具體應用需求,您可以在會話級別或全域性級別調整隔離級別以適應特定的使用場景。