mysql事務隔離級別

2021-09-24 01:52:26 字數 3341 閱讀 2954

mysql是乙個伺服器/客戶端架構的軟體,對於同乙個伺服器來說,可以有若干個客戶端與之連線,每個客戶端與伺服器連線上之後,就可以稱之為乙個會話(session)。我們可以同時在不同的會話裡輸入各種語句,這些語句可以作為事務的一部分進行處理。不同的會話可以同時傳送請求,也就是說伺服器可能同時在處理多個事務,這樣子就會導致不同的事務可能同時訪問到相同的記錄。我們前邊說過事務有乙個特性稱之為隔離性,理論上在某個事務對某個資料進行訪問時,其他事務應該進行排隊,當該事務提交之後,其他事務才可以繼續訪問這個資料。但是這樣子的話對效能影響太大,所以設計資料庫的大叔提出了各種隔離級別,來最大限度的提公升系統併發處理事務的能力,但是這也是以犧牲一定的隔離性來達到的。

未提交讀(read uncommitted)髒讀

如果乙個事務讀到了另乙個未提交事務修改過的資料,那麼這種隔離級別就稱之為未提交讀(英文名:read uncommitted),示意圖如下:

如上圖,session asession b各開啟了乙個事務,session b中的事務先將id1的記錄的列c更新為'關羽',然後session a中的事務再去查詢這條id1的記錄,那麼在未提交讀的隔離級別下,查詢結果就是'關羽',也就是說某個事務讀到了另乙個未提交事務修改過的記錄。但是如果session b中的事務稍後進行了回滾,那麼session a中的事務相當於讀到了乙個不存在的資料,這種現象就稱之為髒讀,就像這個樣子:

髒讀違背了現實世界的業務含義,所以這種read uncommitted算是十分不安全的一種隔離級別

已提交讀(read committed)不可重複讀

如果乙個事務只能讀到另乙個已經提交的事務修改過的資料,並且其他事務每對該資料進行一次修改並提交後,該事務都能查詢得到最新值,那麼這種隔離級別就稱之為已提交讀(英文名:read committed),如圖所示:

從圖中可以看到,第4步時,由於session b中的事務尚未提交,所以session a中的事務查詢得到的結果只是'劉備',而第6步時,由於session b中的事務已經提交,所以session b中的事務查詢得到的結果就是'關羽'了。

對於某個處在在已提交讀隔離級別下的事務來說,只要其他事務修改了某個資料的值,並且之後提交了,那麼該事務就會讀到該資料的最新值,比方說:

我們在session b中提交了幾個隱式事務,這些事務都修改了id1的記錄的列c的值,每次事務提交之後,session a中的事務都可以檢視到最新的值。這種現象也被稱之為不可重複讀

可重複讀(repeatable read)mysql預設的隔離級別

在一些業務場景中,乙個事務只能讀到另乙個已經提交的事務修改過的資料,但是第一次讀過某條記錄後,即使其他事務修改了該記錄的值並且提交,該事務之後再讀該條記錄時,讀到的仍是第一次讀到的值,而不是每次都讀到不同的資料。那麼這種隔離級別就稱之為可重複讀(英文名:repeatable read),如圖所示:

從圖中可以看出來,session a中的事務在第一次讀取id1的記錄時,列c的值為'劉備',之後雖然session b中隱式提交了多個事務,每個事務都修改了這條記錄,但是session a中的事務讀到的列c的值仍為'劉備',與第一次讀取的值是相同的。

序列化(serializable)幻讀

如果乙個事務先根據某些條件查詢出一些記錄,之後另乙個事務又向表中插入了符合這些條件的記錄,原先的事務再次按照該條件查詢時,能把另乙個事務插入的記錄也讀出來,那就意味著發生了幻讀,示意圖如下:

如上圖,session a中的事務先根據條件number > 0這個條件查詢表hero,得到了name列值為'劉備'的記錄;之後session b中提交了乙個隱式事務,該事務向表hero中插入了一條新記錄;之後session a中的事務再根據相同的條件number > 0查詢表hero,得到的結果集中包含session b中的事務新插入的那條記錄,這種現象也被稱之為幻讀

有的同學會有疑問,那如果session b中是刪除了一些符合number > 0的記錄而不是插入新記錄,那session a中之後再根據number > 0的條件讀取的記錄變少了,這種現象算不算幻讀呢?明確說一下,這種現象不屬於幻讀幻讀強調的是乙個事務按照某個相同條件多次讀取記錄時,後讀取時讀到了之前沒有讀到的記錄。

小貼士: 那對於先前已經讀到的記錄,之後又讀取不到這種情況,算啥呢?其實這相當於對每一條記錄都發生了不可重複讀的現象。幻讀只是重點強調了讀取到了之前讀取沒有獲取到的記錄。

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...

MySQL事務隔離級別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...

Mysql 事務隔離級別

mysql 5.5預設儲存引擎 表型別 使用的是innodb,它是支援acid特性的 acid,指資料庫的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否...