1. 程式人生 > >Mysql 事務的四種隔離級別介紹

Mysql 事務的四種隔離級別介紹

1、未提交讀(READ UNCOMMITTED)

事務中的修改,即使沒有提交,對於其他事務來說也是可見的。也就是說事務可以讀取未提交的資料,也就是髒讀(Dirty Read).

這是最低的隔離級別,實際的應用中一般不用這種隔離級別。

下面來模擬看下效果:

Session 1 :

mysql> show variables like '%isolation%';  【1】
+---------------+------------------+
| Variable_name | Value            |
+---------------+------------------+
| tx_isolation  | READ-UNCOMMITTED |
+---------------+------------------+
1 row in set (0.00 sec)

mysql> start transaction;                  【3】
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO test(num) VALUES(1);     【4】
Query OK, 1 row affected (0.00 sec)

Session 2 :
mysql> show variables like '%isolation%';  【2】
+---------------+------------------+
| Variable_name | Value            |
+---------------+------------------+
| tx_isolation  | READ-UNCOMMITTED |
+---------------+------------------+
1 row in set (0.00 sec)

mysql> select * from test;                【5】
+----+------+
| id | num  |
+----+------+
|  3 |    1 |
+----+------+
1 row in set (0.00 sec)

可見session 1中的更新還沒有提交commit ,session 2中可以查詢到session 1插入的結果。

2、提交讀(READ COMMITTED)

一個事務所做的修改在提交前對於其他事務是不可見的。所以一個事務中兩次執行同樣的查詢,有可能會產生不一樣的結果,

因此這個隔離級別也成為不可重複讀(nonrepeatable read)

下面來模擬看下效果(右邊的序號表示執行順序):

session 1 :

mysql> show variables like '%isolation%';   【1】
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| tx_isolation  | READ-COMMITTED |
+---------------+----------------+
1 row in set (0.00 sec)

mysql> start transaction;                   【3】
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO test(num) VALUES(1);      【4】
Query OK, 1 row affected (0.00 sec)

mysql> COMMIT;                             【6】
Query OK, 0 rows affected (0.07 sec)

session 2 :
mysql> show variables like '%isolation%';      【2】
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| tx_isolation  | READ-COMMITTED |
+---------------+----------------+
1 row in set (0.00 sec)

mysql> select * from test;                   【5】
Empty set (0.00 sec)

mysql> select * from test;                  【7】
+----+------+
| id | num  |
+----+------+
|  1 |    1 |
+----+------+
1 row in set (0.00 sec)

可見在commit 前,session 2是看不到session 1的更新結果的。

3、可重複讀(REPEATABLE READ)

可重複讀是mysql預設的隔離級別。可重複讀保證了同一個事務中對同樣記錄的查詢結果是一致的,所有他不會產生以上兩種隔離級別的髒讀和結果不一致情況,、

但是無法解決幻讀的問題。

下面來模擬看下效果:

session 1 :

mysql> show variables like '%isolation%';   【1】
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)

mysql> start transaction;                      【3】
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test where num=2;          【5】
Empty set (0.01 sec)

mysql> select * from test where num=2;           【7】 說明沒出現未提交讀的髒讀
Empty set (0.00 sec)

mysql> select * from test where num=2;            【9】 說明沒出現提交讀的情況
Empty set (0.00 sec)

mysql>  insert into test(num) values(2);        【10】
Query OK, 1 row affected (0.00 sec)

mysql> commit;                                  【11】
Query OK, 0 rows affected (0.03 sec)

mysql> select * from test where num=2;             【12】  Fuck ,剛不是跟我說沒有num=2的記錄麼。   這就是幻讀。
+----+------+
| id | num  |
+----+------+
|  4 |    2 |
|  5 |    2 |
+----+------+
2 rows in set (0.00 sec)

Session  2 :
mysql> show variables like '%isolation%';    【2】
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)

mysql> start transaction;                      【4】
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test(num) values(2);          【6】
Query OK, 1 row affected (0.00 sec)

mysql> commit;                                 【8】
Query OK, 0 rows affected (0.06 sec)

幻讀問題可通過多版本併發控制(MVCC)來解決。

4、可序列話(SERIALIZABLE)

可序列話是最高的隔離級別,通過強制事務序列執行來避免前面說的問題。

簡單說,他會在讀取的每一行上都加上鎖,所以會導致大量的超時 和鎖爭用問題。

實際應用中很少用到這個,除非需要確保資料的一致性並且沒有併發的情況下才考慮。

下面來模擬看下效果:

Session 1 :

mysql> show variables like '%isolation%';
+---------------+--------------+
| Variable_name | Value        |
+---------------+--------------+
| tx_isolation  | SERIALIZABLE |
+---------------+--------------+
1 row in set (0.00 sec)

mysql> start transaction;                  【1】
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;                   【3】
+----+------+ 
| id | num  |
+----+------+
|  1 |    2 |
+----+------+
1 row in set (0.00 sec)

Session 2 :

mysql> show variables like '%isolation%';    【2】
+---------------+--------------+
| Variable_name | Value        |
+---------------+--------------+
| tx_isolation  | SERIALIZABLE |
+---------------+--------------+
1 row in set (0.00 sec)

mysql> update test set num=5 where num=2;    【4】
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

可見,如果session 1不commit的話 ,session 2 就會一直等待 知道超時。

附:


相關推薦

Mysql 事務隔離級別介紹

1、未提交讀(READ UNCOMMITTED) 事務中的修改,即使沒有提交,對於其他事務來說也是可見的。也就是說事務可以讀取未提交的資料,也就是髒讀(Dirty Read). 這是最低的隔離級別,實際的應用中一般不用這種隔離級別。 下面來模擬看下效果: Session 1

事務個特徵和MySQL隔離級別

來源:https://www.jb51.net/article/96179.htm 一、首先什麼是事務? 事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要麼全部成功,要麼一個都不做。 事

轉載:數據庫事務隔離級別

log 有效 取數 控制 get 同一行 幻讀 url phantom 原帖:http://blog.csdn.net/tolcf/article/details/49283575 定義:在數據庫操作中,為了有效保證並發讀取數據的正確性,提出的事務隔離級別。 數據庫事務的隔

MySQL 事務隔離級別

mic 處理 isolation 不存在 ola dir ODB ble 都是 MySQL 事務的四種隔離級別 1 事務的基本要素(ACID) 原子性(Atomicity):事務開始後所有操作,要麽全部做完,要麽全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到

mysql ACID與隔離級別歸納總結

重新 style 出現 等待 mic 復讀 級別 for 保存 關於數據庫的ACID特性已經有很多的介紹,這裏再重新歸納總結一下: A(atomicity)原子性:   即事務要麽全部做完,要麽全部不做,不會出現只做一部分的情形,如A給B轉帳,不會出現A的錢少了,

MySql隔離級別

serial 改變 共享 表結構 競爭 隔離級別 處理 nal 完全 什麽是事務 事務是應用程序中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要麽全部成功,要麽一個都不做。 事務的結束有兩種

SQL事務隔離級別

lock 出現 四種 操作 rep table repeat 新的 不可重復讀 1未提交讀(Read uncommitted):完成不鎖表,所以會出現臟數據。2提交讀(Read committed):1.事務1中update才鎖表,可以select到最新數據。       

MySQL ACID及隔離級別的解釋

失敗 操作 mage city 而且 tab 過多 保存 事務提交 以下內容出自《高性能MySQL》第三版,了解事務的ACID及四種隔離級有助於我們更好的理解事務運作。 下面舉一個銀行應用是解釋事務必要性的一個經典例子。假如一個銀行的數據庫有兩張表:支票表(checkin

數據庫的隔離級別事務特性

錯誤 永久 wol gpo sele ability 機制 borde 一個用戶 數據庫事務的四大特性: 事務(Transaction)是並發控制的基本單位。所謂事務,它是一個操作序列,這些操作要麽都執行,要麽都不執行,它是一個不可分割的工作單位。例如,銀行轉帳工作:從一個

MySQL系列之二隔離級別及加鎖

死鎖 開啟 serial 串行化 工作 保存 city innodb sele 事務 1、定義:所有操作必須成功完成,否則在每個操作中所作的所有更改都會備撤銷。 2、事務的ACID 原子性atomicity 一致性consistency 隔離性isola

資料庫【三讀現象】與【隔離級別】+MySQL相關命令

資料庫事務特性ACID 資料庫事務特徵,即 ACID: A Atomicity 原子性 事務是一個原子性質的操作單元,事務裡面的對資料庫的操作要麼都執行,要麼都不執行, C Consistent 一致性 在事務開始之前和完成之後,資料都必須保持一致狀態,必須保證資料庫的完整性

Spring事務特性 事務的三併發訪問問題真實場景解讀 事務隔離級別 事務的傳播行為

1.事務的基本特性(ACID) 原子性:一個事務是一個整體,不可分割,事務中的操作要麼全部成功要麼全部失敗 一致性:一致性和原子性描述的是同一件事情,原子性是從操作的角度來說,要麼全部成功要麼全部失敗,一致性是從資料的角度來說,資料要麼是事務提交前的狀態,要麼是事務全部完成的狀態.比

MYSQL資料庫事務4隔離級別及7傳播行為

事務的特性: 原子性:事務的不可分割,組成事務的各個邏輯單元不可分割。 一致性:事務執行的前後,資料完整性保持一致。 隔離性:事務執行不應該受到其他事務的干擾。 永續性:事務一旦結束,資料就持久化到資料庫中。 檢視/設定隔離級別    檢視:SELECT @@tx

事務隔離級別和七傳播屬性

一、事務的基本要素(ACID) 1、原子性(Atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是一個不可分割的整體,就像化學中學過的原子,是物質構

事務隔離級別和七傳播機制

事務四大特性:   * 原子性(Atomicity)  :強調的事務的不可分割.   * 一致性(Consistency)    :強調的事務的執行前後,資料庫的的完整性保持一致.   * 隔離性(Isolation)  :強調的事務的併發的訪問,一個事務的執行,不應該受

MySQL數據庫中的隔離級別

很多 .html ali 讀取 之前 範圍 同時 ref 多次 原文:MySQL數據庫中的四種隔離級別 事務的隔離性比想象的要復雜,在 SQL 標準中定義了四種級別的隔離級別。通常而言,較低級別的隔離通常可以執行更高的並發,系統的開銷也更低 READ UNCOMMI

關係型資料庫事務的ACID原則和隔離級別

一、事務的四大特性的介紹 1、A (Atomicity) 原子性 就是說事務裡的所有操作要麼全部做完,要麼都不做,事務成功的條件是事務裡的所有操作都成功,只要有一個操作失敗,整個事務就失敗,需要回滾。 舉例:銀行轉賬,從A賬戶轉10元至B賬戶,需要經過兩個步驟:  

mysql 隔離級別

共享 內容 ren 說明 因此 系統 tran nsa 允許 事務的 四個特征(ACID) 事務具有四個特征:原子性( Atomicity )、一致性( Consistency )、隔離性( Isolation )和持續性( Durability )。這四個特性簡稱

MySQL面試題--常見的隔離級別

    什麼是事務 事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有

面試問爛的 MySQL 隔離級別,看完吊打面試官!

什麼是事務 事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具