SQL 隔離級別


  在SQL標准中定義了四種隔離級別,每一種級別都規定了一個事務中所做的修改,哪些在事務內和事務間是可見的,哪些是不可見的。較低級別的隔離通常可以執行更高的並發,系統的開銷也更低。

簡單的介紹四種隔離級別:

1、READ UNCOMMITTED (未提交讀)

  在 READ UNCOMMITTED 級別,事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的數據,這也被稱為臟讀(Dirty Read)。這個級別會導致很多問題,從性能上來說,READ UNCOMMITTED 不會比其他的級別好太多,但卻缺乏其他級別的很多好處,除非真的有非常必要的理由,在實際應用中一般很少使用。

2、READ COMMITTED (提交讀)

  大多數數據庫系統的默認級別都是 READ COMMITTED(但 MySQL 不是)。READ COMMITTED 滿足前面提到的隔離性的簡單定義:一個事務開始時,只能“看到”已經提交的事物所做的修改。換句話說,一個事務從開始知道提交之前,所作的任何修改對其他事務都是不可見的。這個級別有時候也叫做不可重復讀nonrepeatable read因為兩次執行相同的查詢,可能會得到不一樣的結果。

3、REPEATABLE READ (可重復讀)

  REPETABLE READ 解決了臟讀的問題。該級別保證了在同一個事物中多次讀取同樣記錄的結果是一致的。但是理論上,可重復讀隔離級別還是無法解決另外一個幻讀(Phantom Read) 的問題。所謂幻讀,指的是當某個事務在讀取某個范圍內的記錄時,另外一個事務又在該范圍內插入了新的記錄,當之前的事務再次讀取該范圍的記錄時,會產生幻行(Phantom Row)。InnoDB 和 XtraDB 存儲引擎通過多版本並發控制(MVCC,Multiversion Concurrency Control) 解決了幻讀的問題。可重復讀是MySQL的默認事務隔離級別。

4、SERIALIZABLE (可串行化)

  SERIALIZABLE 是最高的隔離界別。它通過強制事務串行執行,避免了前面所說的幻讀的問題。簡單來說,SERIALIZABLE會再讀取的每一行數據上都加鎖,所有可能導致大量的超時鎖爭用的問題。實際應用中也很少用到這個隔離級別,只有在非常需要保證數據的一致性而且接受沒有並發的情況下,才考慮采用該級別。

ANSI SQL 隔離級別

隔離級別 臟讀可能性 不可重復讀可能性 幻讀可能性 加鎖讀
READ UNCOMMITTED Yes Yes Yes No
READ COMMITTED No Yes Yes No
REPEATABLE READ No No Yes No
SERIALIZABLE No No No Yes


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM