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)來解決。
可序列話是最高的隔離級別,通過強制事務序列執行來避免前面說的問題。
簡單說,他會在讀取的每一行上都加上鎖,所以會導致大量的超時 和鎖爭用問題。
實際應用中很少用到這個,除非需要確保資料的一致性並且沒有併發的情況下才考慮。
下面來模擬看下效果:
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 四種隔離級別,看完吊打面試官!
什麼是事務 事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具