READ UNCOMMITED(未提交讀)
在RERAD UNCOMMITED級別,事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的數據,這也成為臟讀(Dirty Read)。這個級別會導致很多問題,從性能上說READ UNCOMMITED 不會比其他的級別好太多,但缺乏其他級別的好多好處,除非有非常必要的理由,在實際的應用中一般很少使用READ UNCOMMITED.
READ COMMITED (提交讀)
大多數數據庫系統的默認隔離級別都是READ COMMITED (但是MYSQL不是)。READ COMMITED 滿足前面提到的隔離性的簡單定義:一個事務開始時,只能看到已經提交的事務所做的修改。換句話說,一個事務從開始到提交之前,所做的任何修改對其他事務都 是不可見的。這個級別有時候也叫做不可重復的(nonerepeatable read),因為兩次執行同樣的查詢,可能會得到不一樣的結果。
REPEATABLE READ (可重復讀)
REPEATABLE READ (可重復讀) 解決了臟讀問題。該級別保證了在同一個事務中多次讀取同樣的記錄的結果是一致的。但是,理論上,可重復讀隔離級別還是無法解決另一個幻讀 (PhantomRead)的問題。所謂幻讀,指的是當某個事務在讀取某個范圍內的記錄時,另外一個事務又在該范圍內插入了新的記錄,當之前的事務再次讀 取該范圍的記錄時,會產生幻行(Phantom Row)。InnoDB和XtraDB 存儲引擎通過多版並發控制(MVCC ,Multivesion Concurrency Control )解決了幻讀問題。
可重復讀(REPEATABLE READ)是Mysql 默認的事務隔離級別,其中InnoDB主要通過使用MVVC獲得高並發,使用一種被稱為next-key-locking的策略來避免幻讀。
SERIALIZABLE(可串行化)
SERIALIZABLE是最高的隔離級別。它通過強制事務串行,避免了前面說的幻讀問題。簡單的來說,SERIALIZABLE會在讀的每一行數據上 都加上鎖,所以可能導致大量的超時和鎖征用問題。實際應用中也很少用到這個隔離級別,只有在非常需要確保數據的一致性而且可以接受沒有並發的情況,才可考 慮用該級別。