.

sql標準定義了4種隔離級別,包含了一些具體規則,用來限定事物內外的那些變化是可見的,哪些是不可見的。

低級別的隔離級一般支援更高的併發處理,擁有更低的系統開銷。

1到4,4種隔離級別:

Read Uncommitt(讀取未提交的內容)

Read Conmmitted(讀取提交內容)

Repeatable read(可重讀)

Serializable(可序列化)

檢視事物隔離級別命令:

SELECT @@tx_isolation;

修改事物隔離級別命令:

set tx_isolation='read_committed'

髒讀的含義:讀取到未提交的資料。

新建一個表:

CREATE TABLE tes(
id INT PRIMARY KEY,
num INT
)

INSERT INTO tes VALUES(1,1),(2,2),(3,3);

啟動一個事物修改事物級別為第一級別執行:

start transaction;

SELECT *FROM tes 

再啟動一個事物修改表中的資料:

start transaction;
update tes set num=10 where id=1;
select * from tes;
ROLLBACK;
SELECT *FROM tes;

再在第一個事物中查詢:

在第二個事物沒有提交的情況下,第一個事物得到了第二個事物修改後的資料。

如果在第二個事物回滾後,第一個事物讀到的資料又回到未修改的狀態

這樣就稱為髒鎖。

第一級別:Read Uncommitt(讀取未提交的內容)
1.所有事物都可以看到其他未提交事物的執行結果。
2.該級別較少用於實際場景,效能沒有優勢。
3.會進行髒讀,讀取到未提交的資料。

 

第二級別:Read Conmmitted(讀取提交內容)
1.大多數資料庫系統的預設隔離級別(不是MySql預設級別)。
2.滿足了單隔離的簡單定義,一個事物只能看見已經提交事物的改變。
3.該隔離級別不可重複讀(Nonrepeatable Read);不可重複讀意味著我們在同一個事務中執行完全相同的select語句時可能看到不一樣的結果。


第三級別:Repeatable read(可重讀)
1.這是MySQL的預設事務隔離級別
2.它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行
3.此級別可能出現幻讀(Phantom Read):使用者讀取某一範圍的資料行時,另一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的資料行時,會發現有新的“幻影” 行.
4.InnoDB和Falcon儲存引擎通過多版本併發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題

 

第4級別:Serializable(可序列化)
1.這是最高的隔離級別
2.它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。
3.在這個級別,可能導致大量的超時現象和鎖競爭

相關文章