MySQL如何保證數據一致性


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實現;

隔離性保證了並發事務之間互不影響;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM