1. 程式人生 > >MySQL事務的隔離級別和ACID

MySQL事務的隔離級別和ACID

導致 持久 完成 數據 實現 容易 規則 除了 一份

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

read-uncommitted (讀未提交 ;會產生臟讀,不可重復讀,幻讀)
在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的性能也不比其他級別好多少。讀取未提交的數據,也被稱之為臟讀(Dirty Read)。
read-committed (讀提交;產生不可重復讀和幻讀)
這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離級別 也支持所謂的不可重復讀(Nonrepeatable Read),因為同一事務的其他實例在該實例處理其間可能會有新的commit,所以同一select可能返回不同結果

repeatable-read (可重讀;)
默認級別,innodb的MVCC配合間隙鎖部分解決幻讀。不能解決的部分幻讀是當事務A去修改事務B已經提交的數據的時候還是會產生幻讀。 系統默認的隔離級別

serializable (可串行化;完全解決幻讀只能串行化。)

這是最高的隔離級別,它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。
這四種隔離級別采取不同的鎖類型來實現,若讀取的是同一個數據的話,就容易發生問題。例如:
臟讀(Drity Read):某個事務已更新一份數據,另一個事務在此時讀取了同一份數據,由於某些原因,前一個RollBack了操作,則後一個事務所讀取的數據就會是不正確的。

不可重復讀(Non-repeatable read):在一個事務的兩次查詢之中數據不一致,這可能是兩次查詢過程中間插入了一個事務更新的原有的數據。
幻讀(Phantom Read):在一個事務的兩次查詢中數據筆數不一致,例如有一個事務查詢了幾列(Row)數據,而另一個事務卻在此時插入了新的幾列數據,先前的事務在接下來的查詢中,就會發現有幾列數據是它先前所沒有的。
什麽是ACID
我認為的是,在我們執行操作時,有始有終,要麽不做,要麽做好。等同於事務中的所有操作要麽全部執行成功,那麽全部執行失敗。
ACID的四大特性
atomicity(原子性)
事務必須是原子工作單元;對於其數據修改,要麽全都執行,要麽全都不執行。通常,與某個事務關聯的操作具有共同的目標,並且是相互依賴的。如果系統只執行這些操作的一個子集,則可能會破壞事務的總體目標。原子性消除了系統處理操作子集的可能性。
consistency(一致性)
事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。某些維護一致性的責任由應用程序開發人員承擔,他們必須確保應用程序已強制所有已知的完整性約束。例如,當開發用於轉帳的應用程序時,應避免在轉帳過程中任意移動小數點。
isolation(隔離性)
一個事務所在修改時,未提交成功,其他事物一律不可幹擾
durability(持久性)
事務完成之後,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持

MySQL事務的隔離級別和ACID