mysql如何保證原子性,一致性,持久性

    1.mysql原子性的保證是利用了undo log。undo log名爲回滾日誌,是實現原子性的關鍵,當事務回滾時可以撤銷全部已經成功執行的sql語句,他須要記錄你要回滾的相應日誌信息。undo log記錄了這些回滾須要的信息,當事務執行失敗或調用了rollback,致使事務須要回滾,即可以利用undo log中的信息將數據回滾到修改以前的樣子。mysql

   2.mysql持久性的保證是利用了redo log。Mysql是先把磁盤上的數據加載到內存中,在內存中對數據進行修改,再刷回磁盤上。若是此時忽然宕機,內存中的數據就會丟失。redo log包括兩部分:一是內存中的日誌緩衝(redo log buffer),該部分日誌是易失性的;二是磁盤上的重作日誌文件(redo log file),該部分日誌是持久的。innodb經過force log at commit機制實現事務的持久性,即在事務提交的時候,必須先將該事務的全部事務日誌寫入到磁盤上的redo log file和undo log file中進行持久化。sql

   3.mysql一致性的保證是從2個方面來保證的。從數據庫層面來看,A(原子性)、I(隔離性)、D(持久性)是手段,是爲了保證一致性,數據庫提供的手段。數據庫必需要實現AID三大特性,纔有可能實現一致性。數據庫

可是,若是你在事務裏故意寫出違反約束的代碼,一致性仍是沒法保證的。例如,你在轉帳的例子中,你的代碼裏故意不給B帳戶加錢,那一致性仍是沒法保證。所以,還必須從應用層角度考慮。從應用層面,經過代碼判斷數據庫數據是否有效,而後決定回滾仍是提交數據!app

mysql保證一致性、原子性和持久性的參考https://blog.csdn.net/xmt1139057136/article/details/104912243ide

redo log和undo log參考https://juejin.im/entry/6844903681091977229ui

相關文章
相關標籤/搜索