在SQL標準中定義了四種隔離級別,每一種級別都規定了一個事務中所作的修改,哪些在事務內和事務間是可見的,哪些是不可見的。較低級別的隔離一般能夠執行更高的併發,系統的開銷也更低。數據庫
簡單的介紹四種隔離級別:併發
一、READ UNCOMMITTED (未提交讀)性能
在 READ UNCOMMITTED 級別,事務中的修改,即便沒有提交,對其餘事務也都是可見的。事務能夠讀取未提交的數據,這也被稱爲髒讀(Dirty Read)。這個級別會致使不少問題,從性能上來講,READ UNCOMMITTED 不會比其餘的級別好太多,但卻缺少其餘級別的不少好處,除非真的有很是必要的理由,在實際應用中通常不多使用。spa
二、READ COMMITTED (提交讀)事務
大多數數據庫系統的默認級別都是 READ COMMITTED(但 MySQL 不是)。READ COMMITTED 知足前面提到的隔離性的簡單定義:一個事務開始時,只能「看到」已經提交的事物所作的修改。換句話說,一個事務從開始知道提交以前,所做的任何修改對其餘事務都是不可見的。這個級別有時候也叫作不可重複讀(nonrepeatable read),由於兩次執行相同的查詢,可能會獲得不同的結果。io
三、REPEATABLE READ (可重複讀)table
REPETABLE READ 解決了髒讀的問題。該級別保證了在同一個事物中屢次讀取一樣記錄的結果是一致的。可是理論上,可重複讀隔離級別仍是沒法解決另一個幻讀(Phantom Read) 的問題。所謂幻讀,指的是當某個事務在讀取某個範圍內的記錄時,另一個事務又在該範圍內插入了新的記錄,當以前的事務再次讀取該範圍的記錄時,會產生幻行(Phantom Row)。InnoDB 和 XtraDB 存儲引擎經過多版本併發控制(MVCC,Multiversion Concurrency Control) 解決了幻讀的問題。可重複讀是MySQL的默認事務隔離級別。數據
四、SERIALIZABLE (可串行化)查詢
SERIALIZABLE 是最高的隔離界別。它經過強制事務串行執行,避免了前面所說的幻讀的問題。簡單來講,SERIALIZABLE會再讀取的每一行數據上都加鎖,全部可能致使大量的超時和鎖爭用的問題。實際應用中也不多用到這個隔離級別,只有在很是須要保證數據的一致性並且接受沒有併發的狀況下,才考慮採用該級別。tab
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 |