mysql事物的4種隔離級別
sql標準定義了4種隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。
低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。
首先,我們使用 test 資料庫,新建 tx 表,並且如圖所示開啟兩個視窗來操作同乙個資料庫:
第1級別:read uncommitted(讀取未提交內容)
(1)所有事務都可以看到其他未提交事務的執行結果
(2)本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少
(3)該級別引發的問題是——髒讀(dirty read):讀取到了未提交的資料
複製**
set tx_isolation=』read-uncommitted』;
select @@tx_isolation;
+——————+
| @@tx_isolation |
+——————+
| read-uncommitted |
+——————+
start transaction;
select * from tx;
+——+——+
| id | num |
+——+——+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+——+——+
在事務b中執行更新語句,且不提交
start transaction;
update tx set num=10 where id=1;
select * from tx;
+——+——+
| id | num |
+——+——+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+——+——+
select * from tx;
+——+——+
| id | num |
+——+——+
| 1 | 10 | —>可以看到!說明我們讀到了事務b還沒有提交的資料
| 2 | 2 |
| 3 | 3 |
+——+——+
rollback;
select * from tx;
+——+——+
| id | num |
+——+——+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+——+——+
select * from tx;
+——+——+
| id | num |
+——+——+
| 1 | 1 | —>髒讀意味著我在這個事務中(a中),事務b雖然沒有提交,但它任何一條資料變化,我都可以看到!
| 2 | 2 |
| 3 | 3 |
+——+——+
複製**
第2級別:read committed(讀取提交內容)
(1)這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)
(2)它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變
(3)這種隔離級別出現的問題是——不可重複讀(nonrepeatable read):不可重複讀意味著我們在同乙個事務中執行完全相同的select語句時可能看到不一樣的結果。
|——>導致這種情況的原因可能有:(1)有乙個交叉的事務有新的commit,導致了資料的改變;(2)乙個資料庫被多個例項操作時,同一事務的其他例項在該例項處理其間可能會有新的commit
複製**
set tx_isolation=』read-committed』;
select @@tx_isolation;
+—————-+
| @@tx_isolation |
+—————-+
| read-committed |
+—————-+
start transaction;
select * from tx;
+——+——+
| id | num |
+——+——+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+——+——+
在這事務中更新資料,且未提交
start transaction;
update tx set num=10 where id=1;
select * from tx;
+——+——+
| id | num |
+——+——+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+——+——+
select * from tx; —————>
+——+——+ |
| id | num | |
+——+——+ |
| 1 | 1 |—>並不能看到! |
| 2 | 2 | |
| 3 | 3 | |
+——+——+ |——>相同的select語句,結果卻不一樣
|commit; |
|select * from tx; —————>
+——+——+
| id | num |
+——+——+
| 1 | 10 |—>因為事務b已經提交了,所以在a中我們看到了資料變化
| 2 | 2 |
| 3 | 3 |
+——+——+
複製**
第3級別:repeatable read(可重讀)
(1)這是mysql的預設事務隔離級別
(2)它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行
(3)此級別可能出現的問題——幻讀(phantom read):當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的「幻影」 行
(4)innodb和falcon儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題
複製**
set tx_isolation=』repeatable-read』;
select @@tx_isolation;
+—————–+
| @@tx_isolation |
+—————–+
| repeatable-read |
+—————–+
start transaction;
select * from tx;
+——+——+
| id | num |
+——+——+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+——+——+
在事務b中更新資料,並提交
start transaction;
update tx set num=10 where id=1;
select * from tx;
+——+——+
| id | num |
+——+——+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+——+——+
commit;
select * from tx;
+——+——+
| id | num |
+——+——+
| 1 | 1 | —>還是看不到的!(這個級別2不一樣,也說明級別3解決了不可重複讀問題)
| 2 | 2 |
| 3 | 3 |
+——+——+
commit;
select * from tx;
+——+——+
| id | num |
+——+——+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+——+——+
複製**
第4級別:serializable(可序列化)
(1)這是最高的隔離級別
(2)它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。
(3)在這個級別,可能導致大量的超時現象和鎖競爭
複製**
set tx_isolation=』serializable』;
select @@tx_isolation;
+—————-+
| @@tx_isolation |
+—————-+
| serializable |
+—————-+
start transaction;
start transaction;
insert tx values(『4』,』4』);
error 1205 (hy000): lock wait timeout exceeded; try restarting transaction
update tx set num=10 where id=1;
error 1205 (hy000): lock wait timeout exceeded; try restarting transaction
複製**
參考文章
mysql事務隔離級別詳解
mysql事物隔離級別
複習鞏固加深印象 一。事務 acid原子性,隔離性,一致性,永續性 二。事務隔離級別 通常併發事務處理 1 寫 寫,存在更新丟失問題 2 讀 寫,有隔離性問題,可能遇到髒讀,不可重複讀,幻讀 其中 1.髒讀 a事務讀到b未提交的資料 2.不可重複讀 a事務第二次讀時讀到了b事務提交的寫資料,可能導致...
MySQL事物隔離級別
mysql其實是分為server層和引擎層。server層包括 聯結器 分析器 優化器 執行器 以及查詢快取。在這裡執行的一些mysql自己的一些邏輯,比如函式 儲存過程 檢視 觸發器,但是還沒有真正的去資料檔案中讀取資料。引擎層 innodb myisam memory 負責資料的查詢和提取。現在...
mysql事物隔離級別
事物是區分檔案儲存系統與nosql資料庫重要特性之一,其存在的意義是為了保證即使在併發情況下也能正確的執行crud操作。怎樣才算是正確的呢?這時提出了事物需要保證的四個特性即acid a 原子性 atomicity c 一致性 consistency i 隔離性 isolation d 永續性 du...