數據庫事務的隔離級別

0 概述

數據庫事務(Database Transaction) ,是指作爲單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。事務有四個基本特性,即原子性、隔離性、一致性、持久性。本文主要講述數據庫事務的隔離級別。

1 四種隔離級別

SQL標準中定義了四種隔離級別:

  • 未提交讀(read uncommitted ):事務中的修改,即使沒有提交,對其它事務也是可見的。事務可以讀取未提交的數據,也稱之爲髒讀。
  • 提交讀(read committed ):只能讀取到已經提交的數據,可以避免髒讀。
  • 可重複讀 (repeatable read):可重複讀。在同一個事務內的查詢都是事務開始時刻一致的,InnoDB默認級別。會出現幻讀的情況,所謂的幻讀,當某個事務在讀取某個某個範圍內記錄時候,另外一個事務又在改事務內插入了一新記錄,當之前的事務再次讀取該範圍的記錄時候就會出現幻讀。
  • 串行讀(Serializable):是最高的隔離級別,通過強制的事務串行執行,避免了前面說的幻讀問題。簡單的來說,Serializable會在讀取的每一行數據上加鎖,所以可能導致大量的超時和鎖競爭的問題。實際應用中很少用到這一級別。

首先執行sql 看下當前數據庫事務隔離的級別 show variables like “%iso%”; 從下圖中可以看到當前數據庫事務爲可重複讀(mysq lInnoDB 默認的事務)。
這裏寫圖片描述

2 實例分析

未提交讀(read uncommitted ),會產生髒讀。
設置數據庫事務爲未提交讀(read uncommitted ),執行如下sql:
set session tx_isolation=’read-uncommitted’;從下圖可以發現插入事務還沒有提交,其它的事務已經可以讀取到數據(髒讀)。
這裏寫圖片描述

提交讀(read committed )實例分析:
set session tx_isolation=’read-committed’; 設置數據事務爲提交讀。
開啓事務:
事務中執行select * from user 有四條記錄;然後新開啓一個窗口去插入一條數據(事務爲提交),然後再來執行select * from user;發現還是四條記錄,插入事務提交後再來執行select * from user; 就會發現有五條。
這裏寫圖片描述
插入數據事務:
這裏寫圖片描述

可重複讀實例分析:
開啓事務:
事務中執行select * from user 有三條記錄;然後新開啓一個窗口去插入一條數據,然後再來執行select * from user;發現還是三條記錄,這是因爲事務級別是可重複讀,其實這也產生了幻讀。
這裏寫圖片描述
插入數據:
這裏寫圖片描述

串行讀(Serializable)實例
set session tx_isolation=”Serializable”;

先開啓一個事務:
這裏寫圖片描述
打開一個新的窗口,set session tx_isolation=”Serializable”;
再開啓一個事務,可見插入在被阻塞了。
這裏寫圖片描述

發佈了199 篇原創文章 · 獲贊 111 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章