MySQL的主要目標就是保證數據的一致性,通過事務,ACID特性等,來實現數據的一致性;
一致性就是指:數據庫可以從一個正確的狀態遷移到另一個正確的狀態;
事務有四大特性:ACID,C(一致性)就是通過AID來實現的;
A:原子性,一個事務要么全做,要么全不做;
C:一致性,數據庫在任一時刻的數據都是一致的;
I:隔離性,事務之間相互獨立,避免並發事務之間的相互影響;
D:持久性,一個事務一旦提交以后,應該永久保存在磁盤中;
如何保證原子性?
MySQL通過undo log來保證原子性;
比如,要修改A的值,那么在修改之前先讀取A的原值,將A的原值寫入undo log中,然后再修改A的值,再將undo log寫入磁盤,然后將A的新值寫入磁盤,事務提交;
如果在事務執行過程中意外宕機,那么就會讀取undo log,將這個還沒執行完的事務回滾;
如何保證持久性?
通過undo log,每次操作都需要讀寫磁盤,這樣開銷非常大,因此,引入redo log,將修改的值記錄到redo log中,先緩存在內存中,然后再將redo log順序寫入磁盤;
比如,要修改A,B的值,首先讀取A的原值,寫入undo log,然后修改A,將A的新值寫入redo log中,然后讀取B的原值,寫入undo log中,然后修改B的值,將新值寫入redo log中,然后將redo log順序寫入磁盤;
如果在事務在執行過程中宕機了,那么直接用undo log回滾;如果事務已經提交了,那么用redo log重做,保證了原子性和持久性;
如何保證隔離性?
MySQL有四個隔離級別,讀未提交,讀提交,可重復讀,串行化;InnoDB默認級別是可重復讀,通過MVCC實現;
隔離性保證了並發事務之間互不影響;