MySQL事務的隔離級別和ACID

在MySQL中隔離性有4種級別,數據庫

read-uncommitted (讀未提交 ;會產生髒讀,不可重複讀,幻讀)
在該隔離級別,全部事務均可以看到其餘未提交事務的執行結果。本隔離級別不多用於實際應用,由於它的性能也不比其餘級別好多少。讀取未提交的數據,也被稱之爲髒讀(Dirty Read)。
read-committed (讀提交;產生不可重複讀和幻讀)
這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。它知足了隔離的簡單定義:一個事務只能看見已經提交事務所作的改變。這種隔離級別 也支持所謂的不可重複讀(Nonrepeatable Read),由於同一事務的其餘實例在該實例處理其間可能會有新的commit,因此同一select可能返回不一樣結果
repeatable-read (可重讀;)
默認級別,innodb的MVCC配合間隙鎖部分解決幻讀。不能解決的部分幻讀是當事務A去修改事務B已經提交的數據的時候仍是會產生幻讀。 系統默認的隔離級別數據結構

serializable (可串行化;徹底解決幻讀只能串行化。)ide

這是最高的隔離級別,它經過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每一個讀的數據行上加上共享鎖。在這個級別,可能致使大量的超時現象和鎖競爭。
這四種隔離級別採起不一樣的鎖類型來實現,若讀取的是同一個數據的話,就容易發生問題。例如:
髒讀(Drity Read):某個事務已更新一份數據,另外一個事務在此時讀取了同一份數據,因爲某些緣由,前一個RollBack了操做,則後一個事務所讀取的數據就會是不正確的。
不可重複讀(Non-repeatable read):在一個事務的兩次查詢之中數據不一致,這多是兩次查詢過程當中間插入了一個事務更新的原有的數據。
幻讀(Phantom Read):在一個事務的兩次查詢中數據筆數不一致,例若有一個事務查詢了幾列(Row)數據,而另外一個事務卻在此時插入了新的幾列數據,先前的事務在接下來的查詢中,就會發現有幾列數據是它先前所沒有的。
什麼是ACID
我認爲的是,在咱們執行操做時,善始善終,要麼不作,要麼作好。等同於事務中的全部操做要麼所有執行成功,那麼所有執行失敗。
ACID的四大特性
atomicity(原子性)
事務必須是原子工做單元;對於其數據修改,要麼全都執行,要麼全都不執行。一般,與某個事務關聯的操做具備共同的目標,而且是相互依賴的。若是系統只執行這些操做的一個子集,則可能會破壞事務的整體目標。原子性消除了系統處理操做子集的可能性。
consistency(一致性)
事務在完成時,必須使全部的數據都保持一致狀態。在相關數據庫中,全部規則都必須應用於事務的修改,以保持全部數據的完整性。事務結束時,全部的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。某些維護一致性的責任由應用程序開發人員承擔,他們必須確保應用程序已強制全部已知的完整性約束。例如,當開發用於轉賬的應用程序時,應避免在轉賬過程當中任意移動小數點。
isolation(隔離性)
一個事務所在修改時,未提交成功,其餘事物一概不可干擾
durability(持久性)
事務完成以後,它對於系統的影響是永久性的。該修改即便出現致命的系統故障也將一直保持性能

相關文章
相關標籤/搜索