MySQL隔離級別

事務:事務就是一組原子性的SQL查詢,或者說一個獨立的工做單元。 也就是說,事務內的語句,要麼所有執行成功,要麼所有執行失敗。數據庫

事務的特徵:

A(atomicity)原子性併發

C(consistency)一致性性能

I(isolation) 隔離性atom

D(durability) 持久性日誌

四種隔離級別

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

READ COMMITTED (提交讀) 大多數數據庫系統的默認隔離級別都是READ COMMITTED (但MySQL不是)。READ COMMITTED知足前面提到的隔離性的簡單定義:一個事務開始時,只能「看見」已經提交的事務所作的修改。換句話說,一個事務從開始直到提交以前,所作的任何修改對其餘事務都是不可見的。這個級別有時候也叫作不可重複讀(nonrepeatableread),由於兩次執行一樣的查詢,可能會獲得不同的結果。內存

REPEATABLE READ (可重複讀) REPEATABLE READ 解決了髒讀的問題。該級別保證了在同一個事務中屢次讀取一樣記錄的結果是一致的。可是理論上,可重複讀隔離級別仍是沒法解決另一個幻讀(Phantom Read)的問題。所謂幻讀,指的是當某個事務在讀取某個範圍內的記錄時,另一個事務又在該範圍內插入了新的記錄,當以前的事務再次讀取該範圍的記錄時,會產生幻行(Phantom Row)。InnoDB 和XtraDB存儲引擎經過多版本併發控制(MVCC, Multiversion Concurrency Control)解決了幻讀的問題。可重複讀是MySQL的默認事務隔離級別。ci

SERIALIZABLE (可串行化) SERIALIZABLE是最高的隔離級別。它經過強制事務串行執行,避免了前面說的幻讀的問題。簡單來講,SERIALIZABLE 會在讀取的每-行數據上都加鎖,因此可能致使大量的超時和鎖爭用的問題。實際應用中也不多用到這個隔離級別,只有在很是須要確保數據的一致性並且能夠接受沒有併發的狀況下,才考慮採用該級別。資源

死鎖:是指兩個或多個事務再同一資源上相互佔用,並請求鎖定對方佔用的資源,從而致使惡性循環的現象。當多個事務嘗試以不一樣的順序鎖定資源時,就可能產生死鎖。it

事務日誌:

使用事務日誌,存儲引擎再修改表的數據時只須要修改其內存拷貝,再把該修改行爲記錄到持久在硬盤上的事務日誌種,而不用每次都將修改的數據自己持久到磁盤。

使用的是追加的方式,所以寫日誌的操做是磁盤上一小塊區域內的順序I/O,而不像隨機I/O須要在磁盤的多個地方移動磁頭,因此採用事務日誌的方式相對來講要快得多。事務日誌持久之後,內存中被修改的數據在後臺能夠慢慢地刷回到磁盤。目前大多數存儲引擎都是這樣實現的,咱們一般稱之,爲預寫式日誌(Write-Ahead Logging),修改數據須要寫兩次磁盤。若是數據的修改已經記錄到事務日誌並持久化,但數據自己尚未寫回磁盤,此時系統崩潰,存儲引擎在重啓時可以自動恢復這部分修改的數據。具體的恢復方式則視存儲引擎而定。

相關文章
相關標籤/搜索