首頁  >  文章  >  資料庫  >  總結SQL92標準的四種隔離級別

總結SQL92標準的四種隔離級別

藏色散人
藏色散人轉載
2021-12-03 09:46:361777瀏覽

定義

  • Read uncommitted (讀取未提交內容)

在Read uncommitted 級別,事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的數據,這也變成髒讀(Dirty read)。這個等級會導致很多問題,從效能上說 Rea​​d uncommitted 不會比其他的等級好太多,但缺乏其他等級的好多好處,除非有非常必要的理由,在實際的應用中一般很少使用。

  • Read committed (讀取提交內容)

#大多數資料庫系統的預設隔離等級都是 Read committed(但 MySQL 不是)。 Read committed 滿足前面提到的隔離性的簡單定義:當一個事務開始時,只能看到已經提交的事務所所做的修改。換句話說,一個事務從開始到提交之前,所做的任何修改對其他事務都是不可見的。這個等級有時候也叫做不可重複的(Nonrepeatable read),因為兩次執行同樣的查詢,可能會得到不一樣的結果。

  • Repeatable read (可重複讀取)

#Repeatable read 解決了髒讀問題。此等級保證了在同一個事務中多次讀取同樣的記錄的結果是一致的。但是,理論上,可重複讀取隔離等級還是無法解決另一個幻讀 (Phantom read)的問題。所謂幻讀,指的是當某個事務在讀取某個範圍內的記錄時,另外一個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生幻行(Phantom row)。 InnoDB 和 XtraDB 儲存引擎透過多版並發控制(MVCC,Multivesion Concurrency Control)解決了幻讀問題。

Repeatable read 是 Mysql 預設的事務隔離級別,其中 InnoDB主 要透過使用 MVVC 獲得高並發,使用一種被稱為 next-key-locking 的策略來避免幻讀。

  • Serializable (可串列化)

#Serializable 是最高的隔離等級。它透過強制事務串行,避免了前面說的幻讀問題。簡單的來說,Serializable 會在讀取的每一行資料上都加上鎖,所以可能會導致大量的逾時和鎖定徵用問題。實際應用中也很少用到這個隔離級別,只有在非常需要確保資料的一致性而且可以接受沒有並發的情況,才可考慮使用該級別。

隔離等級

ANSI SQL92 P68-69

##××✓Serializable (可串列化)×
Level (隔離等級) #Dirty read (髒讀) Non-repeatable read (不可重複讀取) Phantom (幻讀)
Read uncommitted (讀取未提交內容) #✓
Read committed (讀取提交內容) ×
#Repeatable read (可重複讀取)
##× ×
建議學習:《

mysql影片教學》                         ##   ##  ##

以上是總結SQL92標準的四種隔離級別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除