Mysql事物的4種隔離級別11

2021-08-21 01:43:21 字數 4826 閱讀 3520

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...